表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 箱我这样写
select a.*,x.B数量,y.C数量,z.D数量,x.单位 from a
left join (select id,sum(B数量),单位 from b group by id,单位) x on a.id=x.id
left join (select id,sum(C数量),单位 from c group by id,单位) y on a.id=y.id
left join (select id,sum(D数量),单位 from d group by id,单位) z on a.id=z.id
但是出现笛卡尔乘积,如果把单位加入连接条件的话就会漏掉数据
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 箱我这样写
select a.*,x.B数量,y.C数量,z.D数量,x.单位 from a
left join (select id,sum(B数量),单位 from b group by id,单位) x on a.id=x.id
left join (select id,sum(C数量),单位 from c group by id,单位) y on a.id=y.id
left join (select id,sum(D数量),单位 from d group by id,单位) z on a.id=z.id
但是出现笛卡尔乘积,如果把单位加入连接条件的话就会漏掉数据
解决方案 »
- 任何从一个具有大批量数据的表中取指定页的20行,写出数据库分页的SQL语句,并说明执行语句的性能瓶颈主要在哪部分。在线 急急!!
- 一个非常复杂的两表查询(select)语句
- 连接数据库的一个实例,看看JDBC驱动有没有安装成功?
- 如何实现映射
- 在sql语句中如何对ntext类型的字段进行替换字符串等操作?
- 根据不同及格线,查询本次考试,输出学号,姓名、笔试成绩、机试成绩、是否通过,如果未参加考试,则成绩处显示缺考,缺考视为不通过
- 还是交叉表的问题,我的语句有错误,请帮忙看看
- 如何将一个表中的列替换成其他表中的列~
- 为什么sql server 会自动回滚事务?
- 请问在数据库种产生随机的序列的第二种方法
- 触发器 多表问题
- 存储过程
你这CPU 又是公斤 又是 箱的,看了好乱!
就是说应该先把B,C,D三个表full join连接起来,然后才把A表中的名称加入结果中,但是full join如果B中有而C中没有的话就会有一个NULL值
insert @a select 1 ,'CPU'
union all select 2 ,'MEMORY'
union all select 3 ,'LCD'
union all select 4 ,'MOUSE'declare @B table(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 ,'公斤'declare @C table(ID int, C数量 int,单位 varchar(20))
insert @c select 1 ,5 ,'公斤'
union all select 3, 10 ,'公斤'declare @D table( ID int, D数量 int, 单位 varchar(20))
insert @d select 1 ,10 ,'箱'
union all select 2 ,10 ,'箱'
union all select 3 ,5, '箱'select a.id,名称,isnull(b数量,0) b数量,isnull(c数量,0) c数量,isnull(d数量,0) d数量,单位 from @a a Left join
(select coalesce(j.id,z.id) id,b数量,c数量,d数量,coalesce(j.单位,z.单位) 单位 from(
select coalesce(x.id,y.id) id,b数量,c数量,coalesce(x.单位,y.单位) 单位 from (select id,sum(B数量) b数量,单位 from @b b group by id,单位 ) x full join
(select id,sum(C数量) c数量,单位 from @c c group by id,单位) y on x.id=y.id and x.单位=y.单位) j
full join (select id,sum(D数量) d数量,单位 from @d d group by id,单位) z on j.id=z.id and j.单位=z.单位) n
On a.id=n.id
----------- --------------- ----------- ----------- ----------- --------------
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 箱
4 MOUSE 0 0 0 NULL
你把sum(D数量)后加别名,在select 调用别名试试
SELECT A.[名称]
,MAX(CASE B.BillType WHEN 1 THEN B.数量 ELSE 0 END) AS [B数量]
,MAX(CASE B.BillType WHEN 1 THEN B.数量 ELSE 0 END) AS [C数量]
,MAX(CASE B.BillType WHEN 1 THEN B.数量 ELSE 0 END) AS [D数量]
,B.[单位]
FROM 表A AS A LEFT OUTER JOIN
(SELECT [id],sum(B数量) AS [数量],[单位],1 AS BillType FROM 表B GROUP BY [id],单位
UNION ALL SELECT [id],sum(C数量),[单位],2 FROM 表D GROUP BY [id],单位
UNION ALL SELECT [id],sum(D数量),[单位],2 FROM 表D GROUP BY [id],单位
) AS B ON A.[id]=B.[id]
GROUP BY A.[id],A.[名称]
,B.[单位]
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 LEFT OUTER JOIN
(SELECT [id],sum(B数量) AS [数量],[单位],1 AS BillType FROM 表B GROUP BY [id],[单位]
UNION ALL SELECT [id],sum(C数量),[单位],2 FROM 表D GROUP BY [id],[单位]
UNION ALL SELECT [id],sum(D数量),[单位],2 FROM 表D GROUP BY [id],[单位]
) AS B ON A.[id]=B.[id]
GROUP BY A.[id],A.[名称]
,B.[单位]
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.[ID],
A.名称,
ISNULL(B.B数量,0) as B数量,
ISNULL(C.C数量,0) as C数量,
ISNULL(D.D数量,0) as D数量,
ISNULL(case when B.单位 is not null then B.单位
when C.单位 is not null then C.单位
when D.单位 is not null then D.单位 end, '') as 单位
from A
left join B on B.ID=A.ID
left JOIN C ON C.ID=A.ID
left JOIN D ON D.ID=A.IDdrop table A
drop table B
drop table C
drop table D---------------------------------------------
1 CPU 12 5 10 公斤
1 CPU 5 5 10 箱
2 MEMORY 10 0 10 公斤
2 MEMORY 15 0 10 公斤
3 LCD 0 10 5 公斤
4 MOUSE 0 0 0
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数量),[单位],2 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 10 0 箱
MEMORY 25 0 0 公斤
MEMORY 0 10 0 箱
LCD 0 10 0 公斤
LCD 0 5 0 箱
*/
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.[单位]
/*
名称 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 箱
*/