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
展开
 我来答
Andy_Sun321
2013-08-27 · TA获得超过1376个赞
知道小有建树答主
回答量:811
采纳率:89%
帮助的人:752万
展开全部

假设数据在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值

追问
知道了,弄好了,谢谢你。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式