2017-05-24 42 views
2

我有这样的一个表:SQL UNPIVOT多个列

ProgramNumber Month EU_Date US_Date  Japan_Date 
2006060_PR  1  3/1/2017 9/1/2017  3/1/2018 
2006060_PR  2  4/1/2017 9/1/2017  12/1/2017 
2006060_PR  3  4/1/2017 9/1/2017  12/1/2017 
2006060_PR  4  4/1/2017 9/1/2017  11/1/2017 
2006060_PR  5  5/1/2017 9/1/2017  11/1/2017 

和所需的输出应该是跨越几个月传播日期:

ProgramNumber Dates  1   2  3   4   5 
2006060_PR  EU_Date  3/1/2017 4/1/2017 4/1/2017 4/1/2017 5/1/2017 
2006060_PR  US_Date  9/1/2017 9/1/2017 9/1/2017 9/1/2017 9/1/2017 
2006060_PR  Japan_Date 3/1/2018 12/1/2017 12/1/2017 11/1/2017 11/1/2017 

我尝试这个查询和不知道如何进一步发展。

select ProgramNumber, Dates, [1] from (select ProgramNumber, Month, EU_Date, US_Date, Japan_Date from dbo.TempDates) t 
unpivot (
[1] for Dates in (EU_Date, US_Date,Japan_Date)) p 

感谢您的帮助!使用条件聚合

+1

[xkcd PSA ISO 8601](https://xkcd.com/1179/) – SqlZim

+0

您是不是在月份转动并且无意中发现日期? – xQbert

回答

2

select 
    ProgramNumber 
    , Dates 
    , [1] = max(case when Month = 1 then [ThisDate] end) 
    , [2] = max(case when Month = 2 then [ThisDate] end) 
    , [3] = max(case when Month = 3 then [ThisDate] end) 
    , [4] = max(case when Month = 4 then [ThisDate] end) 
    , [5] = max(case when Month = 5 then [ThisDate] end) 
from (
    select * 
    from (select ProgramNumber, Month, EU_Date, US_Date, Japan_Date from dbo.TempDates) t 
    unpivot ([ThisDate] for Dates in (EU_Date, US_Date,Japan_Date)) p 
) u 
group by ProgramNumber, Dates 

rextester演示:http://rextester.com/RVISN68342

回报:

+---------------+------------+------------+------------+------------+------------+------------+ 
| ProgramNumber | Dates |  1  |  2  |  3  |  4  |  5  | 
+---------------+------------+------------+------------+------------+------------+------------+ 
| 2006060_PR | EU_Date | 2017-01-03 | 2017-01-04 | 2017-01-04 | 2017-01-04 | 2017-01-05 | 
| 2006060_PR | Japan_Date | 2018-01-03 | 2017-01-12 | 2017-01-12 | 2017-01-11 | 2017-01-11 | 
| 2006060_PR | US_Date | 2017-01-09 | 2017-01-09 | 2017-01-09 | 2017-01-09 | 2017-01-09 | 
+---------------+------------+------------+------------+------------+------------+------------+ 
+0

非常感谢!我非常感谢你的帮助! – Hema

+0

@Hema乐于帮忙! – SqlZim

0

只是为了UNPIVOT一种替代是使用CROSS/OUTER APPLY和表值构造

SELECT td.ProgramNumber, 
     v.Dates, 
     MAX(CASE WHEN v.mon = 1 THEN v.dt END) [1], 
     MAX(CASE WHEN v.mon = 2 THEN v.dt END) [2], 
     MAX(CASE WHEN v.mon = 3 THEN v.dt END) [3], 
     MAX(CASE WHEN v.mon = 4 THEN v.dt END) [4], 
     MAX(CASE WHEN v.mon = 5 THEN v.dt END) [5] 
FROM TempDates td 
     CROSS APPLY (
      VALUES ([Month], 'EU_Date', td.EU_Date), 
       ([Month], 'US_Date', td.US_Date), 
       ([Month], 'Japan_Date', td.Japan_Date) 
     ) v(mon, Dates, dt) 
GROUP BY td.ProgramNumber, 
     v.Dates 
+0

只是看到这篇文章...非常感谢! – Hema