两个表的关联查询(200分)

  • 主题发起人 主题发起人 ddw
  • 开始时间 开始时间
D

ddw

Unregistered / Unconfirmed
GUEST, unregistred user!
表a
全部物品
1
2
3
4
:
100


表b
全部地区
d1
:
d40


表c
物品 数量 月份 地区
3 2 5 d2
1 4 12 d1
3 3 2 d40
:
:

现在要查旬c表的数量,形成如下格式

表d
物品 d1地区数量 d2地区数量 …… d40地区数量
1 8 0 …… 20
2 4 5 0
3
:
98
99
100


我曾经问过别人,别人告诉我

SELECT 物品,
SUM(CASE 地区 WHEN 'd1' THEN 数量 ELSE 0 END) AS d1,
SUM(CASE 地区 WHEN 'd2' THEN 数量 ELSE 0 END) AS d2,
SUM(CASE 地区 WHEN 'd3' THEN 数量 ELSE 0 END) AS d3,
...
SUM(CASE 地区 WHEN 'd40' THEN 数量 ELSE 0 END) AS d40
FROM C表
WHERE 月份=8
GROUP BY 物品

出来结果,但是和我的要求差了一点点

结果如下
物品 d1地区数量 d2地区数量 …… d40地区数量
3 6 0 9
10 0 ……

现在我想要得到d表的结构,即物品的顺序要和表a中一一对应,即1-100的所有物品都要列在d表中。
请参看表d。
我还应该加点什么语句???
 
SELECT 物品,
SUM(CASE 地区 WHEN 'd1' THEN 数量 ELSE 0 END) AS d1,
SUM(CASE 地区 WHEN 'd2' THEN 数量 ELSE 0 END) AS d2,
SUM(CASE 地区 WHEN 'd3' THEN 数量 ELSE 0 END) AS d3,
...
SUM(CASE 地区 WHEN 'd40' THEN 数量 ELSE 0 END) AS d40
FROM C表 c right join 表a a on a.物品=c.物品//试一试
WHERE 月份=8
GROUP BY 物品
 
SELECT 物品,
SUM(CASE 地区 WHEN 'd1' THEN 数量 ELSE 0 END) AS d1,
SUM(CASE 地区 WHEN 'd2' THEN 数量 ELSE 0 END) AS d2,
SUM(CASE 地区 WHEN 'd3' THEN 数量 ELSE 0 END) AS d3,
...
SUM(CASE 地区 WHEN 'd40' THEN 数量 ELSE 0 END) AS d40
FROM C表
WHERE 月份=8
GROUP BY 物品
 
在sql sever2000的查询器中,
光标停在第一行,然后提示列名 '物品' 不明确。

 
关键是c表中,并不是所有的1-100物品都有。
 
SELECT C.物品,
SUM(CASE 地区 WHEN 'd1' THEN 数量 ELSE 0 END) AS d1,
SUM(CASE 地区 WHEN 'd2' THEN 数量 ELSE 0 END) AS d2,
SUM(CASE 地区 WHEN 'd3' THEN 数量 ELSE 0 END) AS d3,
...
SUM(CASE 地区 WHEN 'd40' THEN 数量 ELSE 0 END) AS d40
FROM C表 C , A表 A
WHERE C.月份=8
AND A.物品 *= C.物品
GROUP BY C.物品
 
to Del_Sun,你的语句只返回在c表中符合条件的sum之后的两条记录。并不能做到返回所有物品1-100的结果。

to dhl2001,你的结果同 del_sun.

大家快帮帮我啊
 
利用左外联接/右外联接是可以实现的呀!!!
你再调试一下吧,把左外改右外试一试
 
SELECT a.物品,
SUM(CASE 地区 WHEN 'd1' THEN 数量 ELSE 0 END) AS d1,
SUM(CASE 地区 WHEN 'd2' THEN 数量 ELSE 0 END) AS d2,
SUM(CASE 地区 WHEN 'd3' THEN 数量 ELSE 0 END) AS d3,
...
SUM(CASE 地区 WHEN 'd40' THEN 数量 ELSE 0 END) AS d40
FROM C表 C , A表 A
WHERE C.月份=8
AND A.物品 *= C.物品
GROUP BY C.物品
 
to dhl2001 实在麻烦你。
是不是把right join改称left join,可是结果没什么变化啊。还是只能返回几条记录,做不到
100条记录。这几条记录的结果都是已经在c表中sum得出的。


我也不知道怎么回事啊,我的a表,c表都已经建好(但是c表里记录只有10条左右)。
是不是应该吧a表和c表建个关系
 
to dhl2001
SELECT a.物品,
SUM(CASE 地区 WHEN 'd1' THEN 数量 ELSE 0 END) AS d1,
SUM(CASE 地区 WHEN 'd2' THEN 数量 ELSE 0 END) AS d2,
SUM(CASE 地区 WHEN 'd3' THEN 数量 ELSE 0 END) AS d3,
...
SUM(CASE 地区 WHEN 'd40' THEN 数量 ELSE 0 END) AS d40
FROM C表 C , A表 A
WHERE C.月份=8
AND A.物品 *= C.物品
GROUP BY C.物品

这个方法刚才del-sun提供了,结果和你那个好像一样啊。

是不是我的表建的有问题啊??
 
用排序试试
SELECT 物品,
SUM(CASE 地区 WHEN 'd1' THEN 数量 ELSE 0 END) AS d1,
SUM(CASE 地区 WHEN 'd2' THEN 数量 ELSE 0 END) AS d2,
SUM(CASE 地区 WHEN 'd3' THEN 数量 ELSE 0 END) AS d3,
...
SUM(CASE 地区 WHEN 'd40' THEN 数量 ELSE 0 END) AS d40
FROM C表
WHERE 月份=8
ORDER BY 物品
 
d表的列是不确的吧,创建临时表
 
to ALL
真是万分感谢大家,我找到原因了。
代码如下
SELECT A.物品,
SUM(CASE 地区 WHEN 'd1' THEN 数量 ELSE 0 END) AS d1,
SUM(CASE 地区 WHEN 'd2' THEN 数量 ELSE 0 END) AS d2,
SUM(CASE 地区 WHEN 'd3' THEN 数量 ELSE 0 END) AS d3,
...
SUM(CASE 地区 WHEN 'd40' THEN 数量 ELSE 0 END) AS d40
FROM C表 C , A表 A
WHERE C.月份=8
AND A.物品 *= C.物品
GROUP BY A.物品

关键在于SELECT A.物品
和GROUP BY A.物品 都应该为A表
我现在在测试一会,如果没问题,发分。
 
多人接受答案了。
 
后退
顶部