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

时间: 2024-11-03 09:14:46

sql学习系列-行转列问题 动态列展示的相关文章

Silverlight系列--动态生成DataGrid列 根据动态列绑定Dictionary数据

1.获取表头数据源动态生成DataGrid表头 DataGridTextColumn d = new DataGridTextColumn(); d.Header = itemPriceClass.PriceKindCode + itemPriceClass.PriceKindName; Binding bin = new Binding(); bin.Converter = new RowIndexConverter(); bin.ConverterParameter = itemPriceC

不定列(动态列)报表的数据源处理

动态列报表是动态报表的一种,在报表应用中很常见.这类报表由于无法事先确定列数,因而无法在报表中使用固定列的表达式,而且更加棘手的是报表数据源的准备,因为SQL不支持不定列的结果集,需要动态拼出SQL语句去执行,有时业务逻辑并不很简单,还需要使用存储过程分步完成.而存储过程对集合运算的支持不够,难以使用中间结果(要用临时表),导致完成这类运算并不轻松. 像http://bbs.csdn.net/topics/390937222?page=1#post-398564938中提到的问题,就是一个比较典

sql 语句系列(行与列处理)[八百章之第一章]

排序时对null进行处理 比如说: select * from EMP order by COMM 我需要对红框部分进行desc处理,也就是从大到小排列. 解析: 重点是如何让null独立出去. select * from (select *,case when COMM is null then 0 else 1 end as COMMISNULL from EMP ) x order by COMMISNULL,COMM desc 解法:单独列出一列把null独立出去. 注意null的判断是

mssql sqlserver 不固定行转列数据(动态列)

转自:http://www.maomao365.com/?p=5471 摘要: 下文主要讲述动态行列转换语句,列名会根据行数据的不同, 动态的发生变化 ---------------------------------------------------- 实现思路: 主要将待生成的动态列名,采用脚本拼接起来,然后采用pivot函数 运行,得到相应的结果 本脚本运行环境: sql server 2008 /*生成源数据表*/ create table #t (compname varchar(2

SQL学习系列(一)之多表查询

在数据库中,各个表之间存在一定的联系,如果需要对数据进行一系列的查询是,仅仅从一个表或一个库中获得数据信息是不够的,需要从多个表或多个数据库提取所需要的数据信息,而进行一些简单select语句查询是无法满足用户需求的,这时就需要涉及到高级查询. 以下都用A.B代表数据库表. 1.内连接查询-内连接使用比较运算符对各个表中的数据进行比较操作,并列出各个表中与条件相匹配的所有数据行. 关键字:INNER JOIN或JOIN (1).等值连接 语句格式:select a * ,b * from A a

SQL学习系列(二)之临时表的使用

1.关于使用临时表说明: (1).临时表其实是放在数据库tempdb里的一个用户表. (2).TempTableName必须带“#”,“#"可以是一个或者两个,以#(局部)或##(全局)开头的表,这种表在会话期间存在,会话结束则自动删除. (3).如果创建时不以#或##开头,而用tempdb.TempTable来命名它,则该表可在数据库重启前一直存在. 2.删除临时表 drop table  TempTableName (1).当存储过程完成时,将自动除去在存储过程中创建的本地临时表.由创建表的

再谈extjs4.1中gridpanel动态表头动态列

之前写过一篇gridpanel有关动态列的博客,当时只是实验性的写写,实际项目中也没有用,因为是实验性的写,所以对实际项目考虑的问题不是很多,比如,如果是动态列,数据也是动态的,而且可能不固定,这些具体的问题,只有在实际开发后,才会明白,这次正好顺利开发完gridpanel的动态列,总结一下过程,为遇到同样问题的同学提供一个思路. 因为是实际开发项目,具体的代码比较多,这里只简单说说重点的一些代码,其实这些代码明白后,其他的功能都很好弄.顺便说一下,我后台数据库相关操作用的是c#. 既然是动态列

2019-05-21 SQL学习

SQL学习 新建模板小书匠 sqlserver 动态计算 sqlserver decimal转为varchar mysql 组内分组排序 sqlserver 动态计算 2019年02月28日 18时56分22秒 --模拟数据 IF OBJECT_ID('tempdb..#t')>0 DROP TABLE #t SELECT * INTO #t FROM ( SELECT '1' id,2030 g,265 h, 830 k,'g*h+h*k' gs,0 tt UNION ALL SELECT '

Dynamic CRM 2013学习笔记(二十六)Reporting Service报表 动态参数、参数多选全选、动态列、动态显示行字体颜色

上次介绍过CRM里开始报表的一些注意事项:Dynamic CRM 2013学习笔记(十五)报表入门.开发工具及注意事项,本文继续介绍报表里的一些动态效果:动态显示参数,参数是从数据库里查询出来的:参数可以多选或全选:动态地显示列,列不是固定的:根据某一字段的值来动态地显示整行字体的颜色. 下面介绍详细的方法: 一.动态参数.参数多选全选 动态参数: 首先定义一个Dataset: SELECT DISTINCT new_countryId, new_codename AS name FROM ne