原问题:
表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 箱
下面是解决的方法:
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
结果:
名称 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