现有如下经过条件筛选后的数据表:
地震类型 地震等级
构造地震 一级
火山地震 二级
火山地震 一级
构造地震 三级
火山地震 一级
经过行列后的结构如下:
地震类型 一级 二级 三级
构造地震 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语句,
然后根据实际表结构再做修改.