日期:2014-05-18  浏览次数:20471 次

复杂的SQL查询, 请高手指点
有如下表
灾害等级 面积
 010 3.6  
 103 4.2  
 403 2.1  
 012 3.3
其中灾害等级三位 ,百位为 火灾等级 ,十位为虫害等级,个位为自然灾害等级
每种灾害有分为无,轻,中,强,剧烈;代码为别为0,1,2,3,4;如103 代表 火灾等级为轻(百位为1),虫害等级为无,自然灾害为强(个位为3)
我想获得如下表
灾害等级 火灾面积 虫害面积 自然灾害
轻 3.6 6.9 0
中 0 0 3.3
强 0 0 6.3
剧烈 2.1 0 0
测试表结构如下:
DECLARE @tb1 TABLE(灾害等级 nvarchar(10),面积 decimal(10,1)) 
INSERT @tb1 SELECT '010' , 3.6  
UNION ALL SELECT '103' , 4.2  
 UNION ALL SELECT '403' , 2.1  
 UNION ALL SELECT '012' , 3.3

请高手指点,如能解决.立即结贴给分

------解决方案--------------------
DECLARE @a TABLE(灾害等级 nvarchar(10),面积 decimal(10,1))
INSERT @a SELECT '010' , 3.6
UNION ALL SELECT '103' , 4.2
UNION ALL SELECT '403' , 2.1
UNION ALL SELECT '012' , 3.3 

select '轻' 灾害等级,
火灾面积=isnull(sum(case when left(灾害等级,1)='1' then 面积 end),0),
虫害面积=isnull(sum(case when substring(灾害等级,2,1)='1' then 面积 end),0),
自然灾害=isnull(sum(case when right(灾害等级,1)='1' then 面积 end),0)
from @a 
union all
select '中' 灾害等级,
火灾面积=isnull(sum(case when left(灾害等级,1)='2' then 面积 end),0),
虫害面积=isnull(sum(case when substring(灾害等级,2,1)='2' then 面积 end),0),
自然灾害=isnull(sum(case when right(灾害等级,1)='2' then 面积 end),0)
from @a 
union all
select '强' 灾害等级,
火灾面积=isnull(sum(case when left(灾害等级,1)='3' then 面积 end),0),
虫害面积=isnull(sum(case when substring(灾害等级,2,1)='3' then 面积 end),0),
自然灾害=isnull(sum(case when right(灾害等级,1)='3' then 面积 end),0)
from @a 
union all
select '剧烈' 灾害等级,
火灾面积=isnull(sum(case when left(灾害等级,1)='4' then 面积 end),0),
虫害面积=isnull(sum(case when substring(灾害等级,2,1)='4' then 面积 end),0),
自然灾害=isnull(sum(case when right(灾害等级,1)='4' then 面积 end),0)
from @a 
--result
/*
灾害等级 火灾面积 虫害面积 自然灾害
---- ------------- -------------- -----------
轻 4.2 6.9 .0
中 .0 .0 3.3
强 .0 .0 6.3
剧烈 2.1 .0 .0

(所影响的行数为 4 行)
*/