sql学习系列-行转列问题 动态列展示

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql学习系列-行转列问题 动态列展示相关的知识,希望对你有一定的参考价值。

最近在做项目的过程需要做一个比较复杂的统计报表,涉及行转列问题。

首先看看报表的格式要求:

技术分享

 

格式中要求按照日期的查询进行动态查询列标题,以及将数据进行按照日期进行列展示。

针对此要求,可以做一个简单的例子进行说明,可以进行两个步骤的操作:

(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方面还是需要多掌握基础方面的知识才能很快的对客户的报表要求,进行任务点分解。

 

以上是关于sql学习系列-行转列问题 动态列展示的主要内容,如果未能解决你的问题,请参考以下文章

重温SQL——行转列,列转行

SQL sql语句实现行转列的3种方法

SQL Server 动态行转列(参数化表名分组列行转列字段字段值)

SQL Server 动态行转列(参数化表名分组列行转列字段字段值)

Hive面试题系列第二题-行转列问题

Hive面试题系列第二题-行转列问题