最近在做项目的过程需要做一个比较复杂的统计报表,涉及行转列问题。
首先看看报表的格式要求:
格式中要求按照日期的查询进行动态查询列标题,以及将数据进行按照日期进行列展示。
针对此要求,可以做一个简单的例子进行说明,可以进行两个步骤的操作:
(1)先构造基本的数据;
(2)对构造的数据进行行转列操作。
create table test1
(
int test1,
kqrq datetime,
kqsj nvarchar(30)
);
insert into test1(zh,kqrq,kqsj) values(1,‘2014-1-2‘,‘10:21‘)
insert into test1(zh,kqrq,kqsj) values(1,‘2014-1-3‘,‘11:21‘)
insert into test1(zh,kqrq,kqsj) values(1,‘2014-1-4‘,‘12:21‘)
insert into test1(zh,kqrq,kqsj) values(2,‘2014-1-2‘,‘13:21‘)
insert into test1(zh,kqrq,kqsj) values(2,‘2014-1-3‘,‘14:21‘)
insert into test1(zh,kqrq,kqsj) values(2,‘2014-1-4‘,‘15:21‘)
--动态生成sql语句
declare @start_date varchar(10) = ‘2014-01-02‘,
@end_date varchar(10) = ‘2014-01-04‘;
declare @date varchar(10),
@sql varchar(max) = ‘‘,
@sql2 varchar(8000);
set @date = @start_date;
set @sql2 = ‘select zh ‘
while @date <= @end_date
begin
set @sql2 = @sql2 + ‘,max(case when CONVERT(varchar(100),kqrq,23) =‘‘‘ + @date +
‘‘‘ then kqsj else ‘‘ ‘‘ end) as v_‘ + REPLACE( right(@date,5),‘-‘,‘‘)
set @date = CONVERT(varchar(10),dateadd(day,1,@date),120)
end
set @sql [email protected] + ‘ from test1
group by zh‘
--生产的动态sql语句
select @sql
通过查询,可以得到按照日期作为列标题的结果。
此次查询需要根据日期动态的显示列标题,所以sql中要将日期作为对应的列进行动态比较。
针对这种格式,需要了解行转列的知识,此次使用case when 语法进行解析。
对于sql方面还是需要多掌握基础方面的知识才能很快的对客户的报表要求,进行任务点分解。