首页 新闻 搜索 专区 学院

SQL根据时间分第一二三,<b>SOS</b>

0
悬赏园豆:10 [待解决问题]

现有如下

idx  tdate

1    2012-03-29 07:37:00.000
1    2012-03-29 09:37:00.000
2    2012-03-29 12:01:00.000
2    2012-03-29 14:25:00.000
2    2012-03-29 17:19:00.000
2    2012-03-29 20:03:00.000
2    2012-03-29 23:29:00.000
3    2012-03-29 07:40:00.000
3    2012-03-29 09:43:00.000
4    2012-03-29 12:04:00.000
4    2012-03-29 14:31:00.000
4    2012-03-29 17:25:00.000
4    2012-03-29 20:09:00.000

 

需要开成如下表格

idx   第一次                       第二次                    第三次        。。。共七次

1     2012-03-29 07:37    2012-03-29 09:37

2     2012-03-29 12:01    2012-03-29 14:25   2012-03-29 17:19


。。。

该如何写啊

yht212的主页 yht212 | 初学一级 | 园豆:151
提问于:2012-04-12 11:12
< >
分享
所有回答(4)
0

这个是一个行转列的问题,参考:http://www.cnblogs.com/emmy/archive/2011/11/24/2261893.html,当然这样的例子很多,你在园子里搜索下“SQL行转列”

无之无 | 园豆:5085 (大侠五级) | 2012-04-12 11:21

上面讲行转列的例子我也看过了,不过那些都是固定行名,所以好转,而这个是日期,并且不固定

支持(0) 反对(0) yht212 | 园豆:151 (初学一级) | 2012-04-12 11:37

@yht212: 你可以做个变通:比如,给你的数据表增加一个字段,用于写第几次之类的。

支持(0) 反对(0) 无之无 | 园豆:5085 (大侠五级) | 2012-04-12 13:41

@笨笨蜗牛: 谢谢,后来我也想到这个方法了,已经解决,再次感谢

支持(0) 反对(0) yht212 | 园豆:151 (初学一级) | 2012-04-12 18:45
0

关注。。。

KivenRo | 园豆:1722 (小虾三级) | 2012-04-12 12:43
0

哎呀,希望是Sql Server 2005 以上了

--Sql 2005以上
with ordered_data as
(select *, row_number() over (partition by idx order by tdate) as norder
from <tablename>)
--下面对就可以对ordered_data应用行转列了...省略, 参考我前一个回答
ChatinCode | 园豆:2272 (老鸟四级) | 2012-04-12 15:45
0
CREATE TABLE RowToColum
  (
     idx   INT,
     tdate DATETIME,
  )

go

INSERT INTO RowToColum
SELECT '1',
       '2012-03-29 07:37:00.000'
UNION
SELECT '1',
       '2012-03-29 09:37:00.000'
UNION
SELECT '2',
       '2012-03-29 12:01:00.000'
UNION
SELECT '2',
       '2012-03-29 14:25:00.000'
UNION
SELECT '2',
       '2012-03-29 17:19:00.000'
UNION
SELECT '2',
       '2012-03-29 20:03:00.000'
UNION
SELECT '2',
       '2012-03-29 23:29:00.000'
UNION
SELECT '3',
       '2012-03-29 07:40:00.000'
UNION
SELECT '3',
       '2012-03-29 09:43:00.000'
UNION
SELECT '4',
       '2012-03-29 12:04:00.000'
UNION
SELECT '4',
       '2012-03-29 14:31:00.000'
UNION
SELECT '4',
       '2012-03-29 17:25:00.000'
UNION
SELECT '4',
       '2012-03-29 20:09:00.000'

go

SELECT *,
       Row_number() OVER (partition BY idx ORDER BY tdate) AS rowno
INTO   #cte
FROM   RowToColum

DECLARE @sql VARCHAR(max)

SELECT @sql = ''

SELECT @sql = @sql + '[' + Cast(number AS VARCHAR(20)) + '],'
FROM   master..spt_values
WHERE  type = 'p'
       AND number > 0
       AND number <= (SELECT Max(rowno)
                      FROM   #cte)

SELECT @sql = LEFT(@sql, Len(@sql) - 1)

SET @sql=' SELECT idx, ' + @sql + ' FROM  #Cte PIVOT ( max (tdate) FOR rowno IN ( ' + @sql + ' ) ) AS pvt'

EXEC (@sql)
小材小用 | 园豆:639 (小虾三级) | 2012-04-28 16:46
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册