SQL语句问题,Join后没有的显示为空

carkiller 2009-06-18 03:43:49
3表关联的问题,求救,遇到
表province
id OrganCode proname
1 32 江苏
2 34 安徽
3 36 江西
4 51 四川
5 46 海南
6 11 北京

表MapRegion
RegID Organcode OrganName
1 340100 合肥
2 340200 芜湖
3 320100 南京
4 360100 南昌
5 510100 成都
6 110000 北京
7 460100 海口

表RegionExpand
id REGID(对应是表B的id) CfgName CfgName
1 1 A 2
2 2 B 3
3 3 A 8
4 2 A 6
5 4 A 2
6 5 A 3
7 4 C 4
8 5 D 2
9 6 A 8


我现在的SQL是
SELECT  Top 10  province.proname AS 区域 ,IsNull(SUM(RegionExpand.CfgValue1),0) AS 数量,province.OrganCode 
FROM province INNER JOIN MapRegion ON province.OrganCode = LEFT(MapRegion.OrganCode, 2)
INNER JOIN RegionExpand ON RegionExpand.REGID = MapRegion.RegID
WHERE (RegionExpand.CfgName = 'A')
GROUP BY province.proname, province.OrganCode
ORDER BY 数量 DESC

得到的结果是

安徽省 8 34
江苏省 8 32
北京市 8 11
四川省 3 51
江西省 2 36

我想的到

安徽省 8 34
江苏省 8 32
北京市 8 11
四川省 3 51
江西省 2 36
海南省 null 46


就是统计不到数据的时候显示为空或者是null,请问大家这个该如何修改呢?
...全文
772 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovezx1028 2009-06-20
  • 打赏
  • 举报
回复
学习来的啦。
anheizhizi 2009-06-18
  • 打赏
  • 举报
回复
去掉 ='A' 的条件,把SUM 里面的字段换成一下:
case when CfgName = 'A' then CfgValue1 else 0 end as 数量
「已注销」 2009-06-18
  • 打赏
  • 举报
回复
好像還是有問題,晚上回去給你整,還要減數據,比較煩
「已注销」 2009-06-18
  • 打赏
  • 举报
回复
SELECT Top 10 province.proname AS 区域 ,IsNull(SUM(RegionExpand.CfgValue1),0) AS 数量,province.OrganCode
FROM @province AS province LEFT JOIN @MapRegion AS MapRegion ON province.OrganCode = LEFT(MapRegion.OrganCode, 2)
right JOIN @RegionExpand AS RegionExpand ON RegionExpand.REGID = MapRegion.RegID
AND (RegionExpand.CfgName = 'A')
GROUP BY province.proname, province.OrganCode
ORDER BY 数量 DESC
這下試試
carkiller 2009-06-18
  • 打赏
  • 举报
回复
我观察了一下,大家把inner 换成left 并且把下面的where换成了and 我把大家改动过的语句放到我的sql里面,执行后产生的结果是不一样的
xiequan2 2009-06-18
  • 打赏
  • 举报
回复
left join的时候,where与and里的条件放的位置不对的时候,结果是不一样
carkiller 2009-06-18
  • 打赏
  • 举报
回复
其实表province 里面是全国34个地区
用大家提供的方法得到的都是
江苏省 8 32
北京市 8 11
安徽省 8 34
四川省 3 51
江西省 2 36
全国 0 00
上海市 0 31
黑龙江 0 23
吉林省 0 22
辽宁省 0 21
carkiller 2009-06-18
  • 打赏
  • 举报
回复
还是有问题,我贴全数据库吧

表province
ID OrganCode proname
1 00 全国
2 11 北京市
3 12 天津市
4 13 河北省
5 14 山西省
6 15 内蒙古自治区
7 21 辽宁省
8 22 吉林省
9 23 黑龙江省
10 31 上海市
11 32 江苏省
12 33 浙江省
13 34 安徽省
14 35 福建省
15 36 江西省
16 37 山东省
17 41 河南省
18 42 湖北省
19 43 湖南省
20 44 广东省
21 45 广西壮族自治区
22 46 海南省
23 50 重庆市
24 51 四川省
25 52 贵州省
26 53 云南省
27 54 西藏自治区
28 61 陕西省
29 62 甘肃省
30 63 青海省
31 64 宁夏回族自治区
32 65 新疆维吾尔自治区
33 71 台湾省
34 81 香港特别行政区
35 82 澳门特别行政区

表MapRegion
RegID Organcode OrganName
1 340100 合肥
2 340200 芜湖
3 320100 南京
4 360100 南昌
5 510100 成都
6 110000 北京
7 460100 海口

表RegionExpand
ID REGID CfgName CfgValue1 CfgValue2 CfgValue3
1 1 Past24ProblemsCount 2 NULL NULL
2 2 Past24PatchCount 3 NULL NULL
3 3 Past24ProblemsCount 8 NULL NULL
4 2 Past24ProblemsCount 6 NULL NULL
5 4 Past24ProblemsCount 2 NULL NULL
6 5 Past24ProblemsCount 3 NULL NULL
7 4 Past24PolicyCount 4 NULL NULL
8 5 Past24ErrorCount 2 NULL NULL
9 6 Past24ProblemsCount 8 NULL NULL

olddown 2009-06-18
  • 打赏
  • 举报
回复
试试先。
olddown 2009-06-18
  • 打赏
  • 举报
回复
经过我的调试,发现很多问题,代码改动后可以了

create table province(id int , OrganCode varchar(10) , proname varchar(10))
insert province
select
1 , '32' , '江苏'
union all select
2 , '34' , '安徽'
union all select
3 , '36' , '江西'
union all select
4 , '51' , '四川'
union all select
5 , '46' , '海南'
union all select
6 , '11' , '北京'

create table MapRegion (RegID int , Organcode varchar(10) , OrganName varchar(10))
insert MapRegion
select
1 , '340100' , '合肥'
union all select
2 , '340200' , '芜湖'
union all select
3 , '320100' , '南京'
union all select
4 , '360100' , '南昌'
union all select
5 , '510100' , '成都'
union all select
6 , '110000' , '北京'
union all select
7 , '460100' , '海口'

create table RegionExpand (id int , REGID int , CfgName varchar(10) , CfgValue1 int)
insert RegionExpand
select
1 , 1 , 'A' , 2
union all select
2 , 2 , 'B' , 3
union all select
3 , 3 , 'A' , 8
union all select
4 , 2 , 'A' , 6
union all select
5 , 4 , 'A' , 2
union all select
6 , 5 , 'A' , 3
union all select
7 , 4 , 'C' , 4
union all select
8 , 5 , 'D' , 2
union all select
9 , 6 , 'A' , 8

select MapRegion.OrganCode,RegionExpand.CfgValue1 ,RegionExpand.CfgName from MapRegion left outer join RegionExpand on RegionExpand.REGID = MapRegion.RegID
SELECT Top 10 province.proname AS 区域 ,
IsNull(SUM(bb.CfgValue1),0) AS 数量,
province.OrganCode
FROM province left outer JOIN
(select MapRegion.OrganCode,RegionExpand.CfgValue1 ,isnull(RegionExpand.CfgName,'A') as CfgName from MapRegion left outer join RegionExpand on RegionExpand.REGID = MapRegion.RegID ) bb
ON province.OrganCode = LEFT(bb.OrganCode, 2)
WHERE (bb.CfgName = 'A')
GROUP BY province.proname, province.OrganCode
ORDER BY 数量 DESC
drop table RegionExpand
drop table MapRegion
drop table province
/*
北京 8 11
安徽 8 34
江苏 8 32
四川 3 51
江西 2 36
海南 0 46
*/
carkiller 2009-06-18
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 anheizhizi 的回复:]
SQL code

SELECT Top 10 province.proname AS 区域 ,IsNull(SUM(RegionExpand.CfgValue1),0) AS 数量,province.OrganCode
FROM province left JOIN MapRegion ON province.OrganCode = LEFT(MapRegion.OrganCode, 2)
left JOIN RegionExpand ON RegionExpand.REGID = MapRegion.RegID and RegionExpand.CfgName = 'A'
GROUP BY province.proname, province.OrganCode
ORDER BY 数量 DESC




这样呢
[/Quote]

江苏省 8 32
北京市 8 11
安徽省 8 34
四川省 3 51
江西省 2 36
全国 0 00
上海市 0 31
黑龙江 0 23
吉林省 0 22
辽宁省 0 21
sgtzzc 2009-06-18
  • 打赏
  • 举报
回复

SELECT Top 10 province.proname AS 区域 ,IsNull(SUM(RegionExpand.CfgValue1),0) AS 数量,province.OrganCode
FROM province
LEFT JOIN MapRegion ON province.OrganCode = LEFT(MapRegion.OrganCode, 2)
LEFT JOIN RegionExpand ON RegionExpand.REGID = MapRegion.RegID
AND (RegionExpand.CfgName = 'A')
GROUP BY province.proname, province.OrganCode
ORDER BY 数量 DESC

/**
区域 数量 OrganCode
---- ----------- -----------
安徽 8 34
江苏 8 32
北京 8 11
四川 3 51
江西 2 36
海南 0 46

(所影响的行数为 6 行)

警告: 聚合或其它 SET 操作消除了空值。
**/
csdyyr 2009-06-18
  • 打赏
  • 举报
回复
DECLARE @province TABLE([id] INT, [OrganCode] INT, [proname] NVARCHAR(2))
INSERT @province
SELECT 1, 32, N'江苏' UNION ALL
SELECT 2, 34, N'安徽' UNION ALL
SELECT 3, 36, N'江西' UNION ALL
SELECT 4, 51, N'四川' UNION ALL
SELECT 5, 46, N'海南' UNION ALL
SELECT 6, 11, N'北京'

DECLARE @MapRegion TABLE([RegID] INT, [Organcode] INT, [OrganName] NVARCHAR(2))
INSERT @MapRegion
SELECT 1, 340100, N'合肥' UNION ALL
SELECT 2, 340200, N'芜湖' UNION ALL
SELECT 3, 320100, N'南京' UNION ALL
SELECT 4, 360100, N'南昌' UNION ALL
SELECT 5, 510100, N'成都' UNION ALL
SELECT 6, 110000, N'北京' UNION ALL
SELECT 7, 460100, N'海口'

DECLARE @RegionExpand TABLE([id] INT, [REGID] INT, [CfgName] VARCHAR(1), [CfgValue1] INT)
INSERT @RegionExpand
SELECT 1, 1, 'A', 2 UNION ALL
SELECT 2, 2, 'B', 3 UNION ALL
SELECT 3, 3, 'A', 8 UNION ALL
SELECT 4, 2, 'A', 6 UNION ALL
SELECT 5, 4, 'A', 2 UNION ALL
SELECT 6, 5, 'A', 3 UNION ALL
SELECT 7, 4, 'C', 4 UNION ALL
SELECT 8, 5, 'D', 2 UNION ALL
SELECT 9, 6, 'A', 8

SELECT Top 10 province.proname AS 区域 ,IsNull(SUM(RegionExpand.CfgValue1),0) AS 数量,province.OrganCode
FROM @province AS province LEFT JOIN @MapRegion AS MapRegion ON province.OrganCode = LEFT(MapRegion.OrganCode, 2)
LEFT JOIN @RegionExpand AS RegionExpand ON RegionExpand.REGID = MapRegion.RegID
AND (RegionExpand.CfgName = 'A')
GROUP BY province.proname, province.OrganCode
ORDER BY 数量 DESC
/*
区域 数量 OrganCode
---- ----------- -----------
安徽 8 34
江苏 8 32
北京 8 11
四川 3 51
江西 2 36
海南 0 46
*/

anheizhizi 2009-06-18
  • 打赏
  • 举报
回复

SELECT Top 10 province.proname AS 区域 ,IsNull(SUM(RegionExpand.CfgValue1),0) AS 数量,province.OrganCode
FROM province left JOIN MapRegion ON province.OrganCode = LEFT(MapRegion.OrganCode, 2)
left JOIN RegionExpand ON RegionExpand.REGID = MapRegion.RegID and RegionExpand.CfgName = 'A'
GROUP BY province.proname, province.OrganCode
ORDER BY 数量 DESC



这样呢
carkiller 2009-06-18
  • 打赏
  • 举报
回复
在RegionExpand 表里面REGID是没有MapRegion表里面的REGID的,也就是说RegionExpand没有对应 海南 想在正常的情况下加入 海南 并且没值的时候显示空或者是null
carkiller 2009-06-18
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 csdyyr 的回复:]
--or try

SELECT  Top 10  province.proname AS 区域 ,IsNull(SUM(RegionExpand.CfgValue1),0) AS 数量,province.OrganCode
FROM province left JOIN  MapRegion ON province.OrganCode = LEFT(MapRegion.OrganCode, 2)
left JOIN  RegionExpand ON RegionExpand.REGID = MapRegion.RegID 
AND (RegionExpand.CfgName = 'A') 
GROUP BY province.proname, province.OrganCode
ORDER BY 数量 DESC

[/Quote]

出现了

江苏省 0 32
上海市 0 31
黑龙江 0 23
吉林省 0 22
辽宁省 0 21
内蒙古 0 15
山西省 0 14
河北省 0 13
天津市 0 12
北京市 0 11
carkiller 2009-06-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 csdyyr 的回复:]
SQL code
SELECT Top 10 province.proname AS 区域 ,IsNull(SUM(RegionExpand.CfgValue1),0) AS 数量,province.OrganCode
FROM province left JOIN MapRegion ON province.OrganCode = LEFT(MapRegion.OrganCode, 2)
left JOIN (select * from RegionExpand WHERE (RegionExpand.CfgName = 'Past24ProblemsCount') ) as RegionExpand ON RegionExpand.REGID = MapRegion.RegID

GROUP BY province.proname, provinc…
[/Quote]

在我的数据库里面出现了

江苏省 8 32
北京市 8 11
安徽省 8 34
四川省 3 51
江西省 2 36
全国 0 00
上海市 0 31
黑龙江 0 23
吉林省 0 22
辽宁省 0 21
csdyyr 2009-06-18
  • 打赏
  • 举报
回复
--or try

SELECT Top 10 province.proname AS 区域 ,IsNull(SUM(RegionExpand.CfgValue1),0) AS 数量,province.OrganCode
FROM province left JOIN MapRegion ON province.OrganCode = LEFT(MapRegion.OrganCode, 2)
left JOIN RegionExpand ON RegionExpand.REGID = MapRegion.RegID
AND (RegionExpand.CfgName = 'A')
GROUP BY province.proname, province.OrganCode
ORDER BY 数量 DESC
hui_hui_2007 2009-06-18
  • 打赏
  • 举报
回复
inner join 改成 left join 就行了。
csdyyr 2009-06-18
  • 打赏
  • 举报
回复
SELECT  Top 10  province.proname AS 区域 ,IsNull(SUM(RegionExpand.CfgValue1),0) AS 数量,province.OrganCode 
FROM province left JOIN MapRegion ON province.OrganCode = LEFT(MapRegion.OrganCode, 2)
left JOIN (select * from RegionExpand WHERE (RegionExpand.CfgName = 'Past24ProblemsCount') ) as RegionExpand ON RegionExpand.REGID = MapRegion.RegID

GROUP BY province.proname, province.OrganCode
ORDER BY 数量 DESC
加载更多回复(7)

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧