sql语句中交叉报表的使用

我在数据库中建立一个测试表:tba,然后填进去一些数据,如图一,由于日期跨度比较多,并且也比较随机,没法一列一列的来提,所以我想到用交叉表。在使用交叉表的过程中,出现了一个小问题,因为需要用日期作为后面每列的列名,而日期又是datetime 格式的,所以每次都会报错。有么有大神帮我写一段代码,可以使用交叉表的形式实现图二中的表,最好是能再加上总计数量。

第1个回答  2017-03-09
要想实现上述数据格式,也就是用SQL语句实现交叉表查询,我们分两种情况分别介绍一下:
一、建立静态的交叉表,前提是列数固定,这里要用到 case when 语法,语句如下:
select 电子档案号,纳税人识别号,纳税人名称,
sum(case 税种名称 when '营业税' then 实纳税额 end) as 营业税,
sum(case 税种名称 when '城建税' then 实纳税额 end) as 城市维护建设税,
sum(case 税种名称 when '教育费附加' then 实纳税额 end) as 教育费附加,
sum(case 税种名称 when '地方教育附加' then 实纳税额 end) as 地方教育附加
from dbo.税票
group by 电子档案号,纳税人识别号,纳税人名称
二、动态交叉表查询,前提是列数不固定,语句如下:
declare @sql varchar(8000)
set @sql =''
select @sql = @sql +','+税种名称+'=
sum(case 税种名称when'''+税种名称+'''then 实纳税额else 0 end)'
from dbo.税票 group by 税种名称
exec ('select 电子档案号,纳税人识别号,纳税人名称'+@sql+',sum(实纳税额) As 税额合计from dbo.税票group by 电子档案号,纳税人识别号,纳税人名称')
第2个回答  2017-03-09
DECLARE @s NVARCHAR(4000)
SELECT  @s = ISNULL(@s + ',', '') + QUOTENAME(标志)
FROM 表
---行列转换
DECLARE @SQL NVARCHAR(4000)
SELECT  @SQL='
SELECT *                                           
FROM 表(带有转换标志) PIVOT ( SUM(实际需要字段) 
for [标志] in('+@s+')
 )A'
EXEC (@SQL)

本回答被提问者和网友采纳
相似回答