最近在做項目的過程需要做一個比較復雜的統計報表,涉及行轉列問題。
首先看看報表的格式要求:
格式中要求按照日期的查詢進行動態查詢列標題,以及將數據進行按照日期進行列展示。
針對此要求,可以做一個簡單的例子進行說明,可以進行兩個步驟的操作:
(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 =@sql2 + ' from test1
group by zh'
--生產的動態sql語句
select @sql
通過查詢,可以得到按照日期作為列標題的結果。
此次查詢需要根據日期動態的顯示列標題,所以sql中要將日期作為對應的列進行動態比較。
針對這種格式,需要了解行轉列的知識,此次使用case when 語法進行解析。
對於sql方面還是需要多掌握基礎方面的知識才能很快的對客戶的報表要求,進行任務點分解。