解决一个多表链接问题

原问题:
表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   2 10  , ' 公斤 '
union   all   select   2  , 15  , ' 公斤 '

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

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   END AS   [ B数量 ]
    ,
MAX ( CASE  B.BillType  WHEN   2   THEN  B.数量  ELSE   0   END AS   [ C数量 ]
    ,
MAX ( CASE  B.BillType  WHEN   3   THEN  B.数量  ELSE   0   END AS   [ 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


结果:

None.gif 结果:
None.gif名称                B数量    C数量    D数量    单位
None.gif
-- ------------------------------------
None.gif
CPU                    12               5               0           公斤
None.gifCPU                   
5                 0               10           箱
None.gifMEMORY       
25               0                  0        公斤
None.gifMEMORY          
0               0               10           箱
None.gifLCD                   
0               10               0           公斤
None.gifLCD                   
0                  0               5           箱

其实还有其他方法,这里只不过是记录一下我自己的解决方法,方便以后查阅。
来源: http://community.csdn.net/Expert/topic/5530/5530732.xml?temp=.7443048
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值