当前位置: 代码迷 >> Sql Server >> 全分在线SQL列行转化及统计
  详细解决方案

全分在线SQL列行转化及统计

热度:23   发布时间:2016-04-24 10:18:22.0
全分在线求助:SQL列行转化及统计
现有如下经过条件筛选后的数据表:

           地震类型          地震等级
           构造地震          一级
           火山地震          二级
           火山地震          一级
           构造地震          三级
           火山地震          一级

经过行列后的结构如下:


地震类型            一级                  二级                三级 
构造地震            1                       0                    1
火山地震            2                       1                    0

并且一级,二级,三级这个列字段值是来自表中记录,未知的! 谢谢指点
------解决方案--------------------
if object_id('[tb]') is not null drop table [tb]
create table tb (省 varchar(10),市  varchar(10),地震类型 varchar(20) , 地震等级 varchar(10))
insert into  tb 
select '山东','济南','构造地震','一级' union all               
select '山东','济南','火山地震','二级' union all               
select '河南','郑州','火山地震','一级' union all               
select '河南','郑州','构造地震','三级' union all               
select '河南','开封','火山地震','一级'                         
go

declare @s nvarchar(max)
set @s=''
Select @s=@s+','+quotename([地震等级])+'=sum(case when [地震等级]='+quotename([地震等级],'''')+' then 1 else 0 end)'
from (
select 省 as [地区] ,市,地震类型,地震等级 from tb
union all
select 市 as [地区] ,市,地震类型,地震等级 from tb
) t group by [地震等级]
exec('select t.地区 ,地震类型'+@s+' from
(
select 省 as [地区] ,市,地震类型,地震等级 from tb
union all
select 市 as [地区] ,市,地震类型,地震等级 from tb
) t
group by 地区,地震类型 order by 地区 desc')



--地区 地震类型 一级 二级 三级
--郑州 构造地震 0 0 1
--郑州 火山地震 1 0 0
--山东 构造地震 1 0 0
--山东 火山地震 0 1 0
--开封 火山地震 1 0 0
--济南 构造地震 1 0 0
--济南 火山地震 0 1 0
--河南 构造地震 0 0 1
--河南 火山地震 2 0 0

改成动态的了
------解决方案--------------------
建议LZ把4楼代码中的exec(@tsql)改为print @tsql查看对应执行的SQL语句,
然后根据实际表结构再做修改.
  相关解决方案