当前位置: 代码迷 >> Sql Server >> SQL行转列写法
  详细解决方案

SQL行转列写法

热度:11   发布时间:2016-04-24 09:19:59.0
求一个SQL行转列写法
现有数据表格式如下:
 工号                 日期                  时间
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




  相关解决方案