解决一个多表链接问题

原问题:
表A
ID (主键) 名称
1         CPU
2         MEMORY
3         LCD
4         MOUSE

表B
ID       B数量     单位
1        12       公斤
1        5        箱
2        10       公斤
2        15       公斤

表C
ID       C数量     单位
1        5        公斤
3        10       公斤

表D
ID       D数量     单位
1        10       箱
2        10       箱
3        5        箱

要把四个表连接起来并按单位加总达到下面结果
ID    名称    B数量   C数量   D数量  单位
===== ======= ======= ======= ====== ====
1     CPU     12      5       0      公斤
1     CPU     5       0       10     箱
2     MEMORY  25      0       0      公斤
2     MEMORY  0       0       10     箱
3     LCD     0       10      0      公斤
3     LCD     0       0       5      箱


下面是解决的方法:

create table A (ID int, 名称 varchar(20))
insert A select 1 ,'CPU'
union all select 2 ,'MEMORY'
union all select 3 ,'LCD'
union all select 4 ,'MOUSE'

create table B (ID int, B数量 int, 单位  varchar(20))
insert b select 1 ,12 ,'公斤'
union all select 1 ,5 ,''
union all select 210 ,'公斤'
union all select 2 ,15 ,'公斤'

create table C (ID int, C数量 int,单位  varchar(20))
insert c select 1 ,5 ,'公斤'
union all select 310 ,'公斤'

create table D ( ID int, D数量 int, 单位  varchar(20))
insert d select 1 ,10 ,''
union all select 2 ,10 ,''
union all select 3 ,5''

SELECT  A.[名称]
    ,
MAX(CASE B.BillType WHEN 1 THEN B.数量 ELSE 0 ENDAS [B数量]
    ,
MAX(CASE B.BillType WHEN 2 THEN B.数量 ELSE 0 ENDAS [C数量]
    ,
MAX(CASE B.BillType WHEN 3 THEN B.数量 ELSE 0 ENDAS [D数量]  
    ,B.
[单位]
FROM A AS A INNER  JOIN 
    (
SELECT [id],sum(B数量) AS [数量],[单位],1 AS BillType FROM B GROUP BY [id],[单位]
        
UNION ALL SELECT [id],sum(C数量),[单位],2  FROM C GROUP BY [id],[单位]
        
UNION ALL SELECT [id],sum(D数量),[单位],3  FROM D GROUP BY [id],[单位]
    ) 
AS B ON A.[id]=B.[id]
GROUP BY A.[id],A.[名称],B.[单位]
drop table A
drop table B
drop table C
drop table D


结果:

结果:
名称                B数量    C数量    D数量    单位
--------------------------------------
CPU                   12             5             0          公斤
CPU                   
5               0             10          箱
MEMORY       
25             0                0       公斤
MEMORY          
0             0             10          箱
LCD                   
0             10             0          公斤
LCD                   
0                0             5          箱

其实还有其他方法,这里只不过是记录一下我自己的解决方法,方便以后查阅。
来源:http://community.csdn.net/Expert/topic/5530/5530732.xml?temp=.7443048
posted @ 2007-05-15 09:04  ok_008  阅读(572)  评论(0编辑  收藏  举报
给我写信