解决一个多表链接问题
原问题:
表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
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 箱
名称 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