现有数据表格式如下:
工号 日期 时间
001 2015-03-01 08:00
001 2015-03-01 17:00
001 2015-03-01 19:00
001 2015-03-02 16:00
002 2015-03-01 09:00
002 2015-03-01 18:00
需要转化成如下格式:
工号 日期 时间1 时间2 时间3
001 2015-03-01 08:00 17:00 19:00
001 2015-03-02 16:00
002 2015-03-01 09:00 18:00
求教!
------解决思路----------------------
DECLARE @SQL NVARCHAR(MAX)
DECLARE @M INT,@I VARCHAR(10)
SET @SQL='SELECT 工号,日期'
SELECT TOP 1 @M=COUNT(时间)FROM TB GROUP BY 工号,日期 ORDER BY COUNT(时间)DESC
SET @I=1
WHILE @I<=@M
SELECT @SQL=@SQL+',MAX(CASE WHEN RN='+@I+' THEN 时间 END)[时间'+@I+']',@I=@I+1
SET @SQL=@SQL+'FROM(SELECT *,ROW_NUMBER()OVER(PARTITION BY 工号,日期 ORDER BY 时间)RN FROM TB)T GROUP BY 工号,日期 ORDER BY 工号,日期'
EXEC(@SQL)
------解决思路----------------------
CREATE TABLE #TEST
( 工号 VARCHAR(10), 日期 varchar(10), 时间 varchar(5))
insert into #TEST values
('001', '2015-03-01', '08:00'),
('001', '2015-03-01', '17:00'),
('001', '2015-03-01', '19:00'),
('001', '2015-03-02', '16:00'),
('002', '2015-03-01', '09:00'),
('002', '2015-03-01', '18:00')
go
select *,ROW_NUMBER()over(partition by 工号,日期 order by getdate())id INTO #TEST1 from #TEST;
declare @str nvarchar(max) = '',@str1 nvarchar(max) = '';
with cte as
(select distinct ROW_NUMBER()over(partition by 工号,日期 order by getdate())id from #TEST)
select @str = @str + QUOTENAME(ID) + 'AS' + QUOTENAME(N'时间' + cast(id as varchar(max))) + ',' from cte a;
with cte as
(select distinct ROW_NUMBER()over(partition by 工号,日期 order by getdate())id from #TEST)
select @str1 = @str1 + QUOTENAME(ID) + ',' from cte a;
SET @str1 = LEFT(@STR1,LEN(@STR1)-1)
SET @str = LEFT(@STR,LEN(@STR)-1)
SELECT @STR=N'
select 工号,日期,'+@str+N'
from #TEST1 a
pivot
(max(时间)for ID in('+@str1+'))b'
PRINT @STR
EXEC(@STR)
DROP TABLE #TEST
DROP TABLE #TEST1