
SQL查询语句,将同一个月份里的前两个日期分别成为一列
比如表table1,datepostdate2013-01-0112:12:122013-01-022013-01-0214:15:14NULL2013-01-0315:...
比如表table1,
date postdate
2013-01-01 12:12:12 2013-01-02
2013-01-02 14:15:14 NULL
2013-01-03 15:12:13 2013-01-03
2013-02-01 14:12:13 2013-02-01
2013-03-01 14:12:13 NULL
2013-03-10 18:19:23 2013-03-10
如何拆成table2
date1 date2 postdate1 postdate2
2013-01-01 12:12:12 2013-01-02 14:15:14 2013-01-02 NULL
2013-02-01 14:12:13 NULL 2013-02-01 NULL
2013-03-01 14:12:13 2013-03-10 18:19:23 NULL 2013-03-10 展开
date postdate
2013-01-01 12:12:12 2013-01-02
2013-01-02 14:15:14 NULL
2013-01-03 15:12:13 2013-01-03
2013-02-01 14:12:13 2013-02-01
2013-03-01 14:12:13 NULL
2013-03-10 18:19:23 2013-03-10
如何拆成table2
date1 date2 postdate1 postdate2
2013-01-01 12:12:12 2013-01-02 14:15:14 2013-01-02 NULL
2013-02-01 14:12:13 NULL 2013-02-01 NULL
2013-03-01 14:12:13 2013-03-10 18:19:23 NULL 2013-03-10 展开
展开全部
假设数据在vt表中, date, postdate都为datetime类型(SQL Server 2005或以上适用), 查询结果未对日期值进行格式化, 查询SQL如下:
select d.monthTxt,
max(case when d.idx = 1 then d.date else null end) as date1,
max(case when d.idx = 2 then d.date else null end) as date2,
max(case when d.idx = 1 then d.postdate else null end) as postdate1,
max(case when d.idx = 2 then d.postdate else null end) as postdate2
from (
select s.date, s.postdate,
left(convert(nvarchar(10), s.date, 120), 7) as monthTxt,
row_number() over (partition by left(convert(nvarchar(10), s.date, 120), 7) order by s.date) as idx
from vt s
) d
where d.idx in (1, 2)
group by d.monthTxt
结果如下图:
SQL说明:
left(convert(nvarchar(10), s.date, 120), 7)是获取月份的字串, 就是上图的monthTxt;
里面的子查询使用了row_number分组编号, 按月份字串进行分组, date值升序进行排序编号:
row_number() over (partition by left(convert(nvarchar(10), s.date, 120), 7) order by s.date) as idx;
最外面的查询则按月份分组查询, 获取每月前两个日期date, postdate值
追问
知道了,弄好了,谢谢你。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询