在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题)
原文:在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题)
最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了。
所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。
求一SQL语句。
http://bbs.csdn.net/topics/390496661
-
create table #tab
-
(
-
col1 char(10),
-
col2 char(10),
-
item char(10),
-
num int,
-
[Date] varchar(10))
-
insert #tab values('AAA','BBB','A',50,'2013-06-10')
-
insert #tab values('ABB','BGG','B',30,'2013-06-10')
-
insert #tab values('AAA','BBB','C',80,'2013-06-13')
我的解法:
-
create table tab
-
(
-
col1 char(10),
-
col2 char(10),
-
item char(10),
-
num int,
-
[Date] varchar(10)
-
)
-
-
insert tab values('AAA','BBB','A',50,'2013-06-10')
-
insert tab values('ABB','BGG','B',30,'2013-06-10')
-
insert tab values('AAA','BBB','C',80,'2013-06-13')
-
-
-
-
-
--动态生成sql语句
-
declare @start_date varchar(10) = '2013-06-01',
-
@end_date varchar(10) = '2013-06-30';
-
-
declare @date varchar(10),
-
@sql varchar(max) = '',
-
@sql1 varchar(8000),
-
@sql2 varchar(8000);
-
-
set @date = @start_date;
-
-
set @sql1 = 'select case when rownum = 1 then col1 else '''' end as col1,
-
case when rownum = 1 then col2 else '''' end as col2,
-
item'
-
-
set @sql2 = 'select col1,col2,item,row_number() over(partition by col1,col2
-
order by item) as rownum'
-
-
-
while @date <= @end_date
-
begin
-
set @sql1 = @sql1 + ',v_' + REPLACE( right(@date,5),'-','') +
-
' as ''' + CAST(DATEPART(month,@date) as varchar) + '/' +
-
CAST(DATEPART(day,@date) as varchar) +'''';
-
set @sql2 = @sql2 + ',SUM(case when date =''' + @date +
-
''' then num else 0 end) as v_' +
-
REPLACE( right(@date,5),'-','')
-
-
set @date = CONVERT(varchar(10),dateadd(day,1,@date),120)
-
end
-
-
-
set @sql = @sql1 + ' from (' +
-
@sql2 + ' from tab
-
group by col1,col2,item' +
-
') v'
-
-
--生产的动态sql语句
-
select @sql
-
-
-
exec(@sql)
上面由于是动态生成语句,所以不能用局部的临时表,所以建了一个表。
下面是动态生成的sql语句,经过了格式化:
-
select case when rownum = 1 then col1 else '' end as col1,
-
case when rownum = 1 then col2 else '' end as col2,
-
item,
-
-
v_0601 as '6/1',v_0602 as '6/2',v_0603 as '6/3',
-
v_0604 as '6/4',v_0605 as '6/5',
-
v_0606 as '6/6',v_0607 as '6/7',
-
v_0608 as '6/8',v_0609 as '6/9',
-
v_0610 as '6/10',v_0611 as '6/11',
-
v_0612 as '6/12',v_0613 as '6/13',
-
v_0614 as '6/14',v_0615 as '6/15',
-
v_0616 as '6/16',v_0617 as '6/17',
-
v_0618 as '6/18',v_0619 as '6/19',
-
v_0620 as '6/20',v_0621 as '6/21',
-
v_0622 as '6/22',v_0623 as '6/23',
-
v_0624 as '6/24',v_0625 as '6/25',
-
v_0626 as '6/26',v_0627 as '6/27',
-
v_0628 as '6/28',v_0629 as '6/29',
-
v_0630 as '6/30'
-
from
-
(
-
select col1,col2,item,
-
-
row_number() over(partition by col1,col2 order by item) as rownum,
-
-
SUM(case when date ='2013-06-01' then num else 0 end) as v_0601,
-
SUM(case when date ='2013-06-02' then num else 0 end) as v_0602,
-
SUM(case when date ='2013-06-03' then num else 0 end) as v_0603,
-
SUM(case when date ='2013-06-04' then num else 0 end) as v_0604,
-
SUM(case when date ='2013-06-05' then num else 0 end) as v_0605,
-
SUM(case when date ='2013-06-06' then num else 0 end) as v_0606,
-
SUM(case when date ='2013-06-07' then num else 0 end) as v_0607,
-
SUM(case when date ='2013-06-08' then num else 0 end) as v_0608,
-
SUM(case when date ='2013-06-09' then num else 0 end) as v_0609,
-
SUM(case when date ='2013-06-10' then num else 0 end) as v_0610,
-
SUM(case when date ='2013-06-11' then num else 0 end) as v_0611,
-
SUM(case when date ='2013-06-12' then num else 0 end) as v_0612,
-
SUM(case when date ='2013-06-13' then num else 0 end) as v_0613,
-
SUM(case when date ='2013-06-14' then num else 0 end) as v_0614,
-
SUM(case when date ='2013-06-15' then num else 0 end) as v_0615,
-
SUM(case when date ='2013-06-16' then num else 0 end) as v_0616,
-
SUM(case when date ='2013-06-17' then num else 0 end) as v_0617,
-
SUM(case when date ='2013-06-18' then num else 0 end) as v_0618,
-
SUM(case when date ='2013-06-19' then num else 0 end) as v_0619,
-
SUM(case when date ='2013-06-20' then num else 0 end) as v_0620,
-
SUM(case when date ='2013-06-21' then num else 0 end) as v_0621,
-
SUM(case when date ='2013-06-22' then num else 0 end) as v_0622,
-
SUM(case when date ='2013-06-23' then num else 0 end) as v_0623,
-
SUM(case when date ='2013-06-24' then num else 0 end) as v_0624,
-
SUM(case when date ='2013-06-25' then num else 0 end) as v_0625,
-
SUM(case when date ='2013-06-26' then num else 0 end) as v_0626,
-
SUM(case when date ='2013-06-27' then num else 0 end) as v_0627,
-
SUM(case when date ='2013-06-28' then num else 0 end) as v_0628,
-
SUM(case when date ='2013-06-29' then num else 0 end) as v_0629,
-
SUM(case when date ='2013-06-30' then num else 0 end) as v_0630
-
from tab
-
group by col1,col2,item
-
) v
在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题)的更多相关文章
- 在论坛中出现的比较难的sql问题:29(row_number函数 组内某列的值连续出现3次标记出来)
原文:在论坛中出现的比较难的sql问题:29(row_number函数 组内某列的值连续出现3次标记出来) 在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘 ...
- 在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题)
原文:在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...
- 在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时、分钟计算问题)
原文:在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时.分钟计算问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. ...
- 在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据)
原文:在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决 ...
- 在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列)
原文:在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
- 在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字)
原文:在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
- 在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存)
原文:在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...
- 在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题)
原文:在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得 ...
- 在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名)
原文:在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
随机推荐
- linux下/etc/profile、/etc/bashrc、~/.bashrc 和~/.bash_profile文件的区别
这个一定要理解登录式shell和非登录式shell的区别,前者是完全切换用户,后者是不完全,就算切换过来了,你pwd时家目录还是之前的家目录,所以 登录式顺序为:/etc/bashrc---/etc/ ...
- h2的时间类型和函数
H2时间类型: (时间)TIME: 格式为 hh:mm:ss.对应到Java类型:java.sql.Time. (日期)DATE: 格式为 yyyy-MM-dd.对应到Java类型: java.sql ...
- 写了一个具有future接口的rust测试代码
写了一个具有future接口的rust测试代码 但没有实现future功能,内部是直接求值 struct Future<T> { t: T, } impl<T> Future& ...
- 小D课堂 - 零基础入门SpringBoot2.X到实战_第5节 SpringBoot部署war项目到tomcat9和启动原理讲解_22、SpringBoot启动方式和部署war项目到tomcat9
笔记 1.SpringBoot启动方式讲解和部署war项目到tomcat9 简介:SpringBoot常见启动方式讲解和部署war项目Tomcat 1.ide启动 2.jar包方式启动 ...
- 小D课堂 - 零基础入门SpringBoot2.X到实战_第8节 数据库操作之整合Mybaties和事务讲解_32..SpringBoot2.x持久化数据方式介绍
笔记 1.SpringBoot2.x持久化数据方式介绍 简介:介绍近几年常用的访问数据库的方式和优缺点 1.原始java访问数据库 开发流程麻烦 ...
- 关于PHP7的CURL上传文件
CULR 部分 $url = 'http://localhost/test/curlUploadFile/upload.php'; //处理上传的php文件,根据情况修改 $path='ftp.txt ...
- leetcode 11. Container With Most Water 、42. Trapping Rain Water 、238. Product of Array Except Self 、407. Trapping Rain Water II
11. Container With Most Water https://www.cnblogs.com/grandyang/p/4455109.html 用双指针向中间滑动,较小的高度就作为当前情 ...
- 创建WebApi Odata v3 终结点
开放数据协议(OData) 是用于 web 的数据访问协议. OData 提供统一的方法来构造数据. 查询的数据和操作该数据集通过 CRUD 操作 (创建. 读取. 更新和删除). OData 支持 ...
- python-learning-第二季-数据处理numpy
https://www.bjsxt.com/down/8468.html numpy-科学计算基础库 例子: import numpy as np #创建数组 a = np.arange() prin ...
- cJSON笔记
github地址: https://github.com/DaveGamble/cJSON 需要将cJSON.h 和 cJSON.c拷贝到路径下,并且连接所需库文件 -lm 步骤:1.先将普通的jso ...
