SQL Server取消透视与多列

时间:2018-10-29 20:16:24

标签: sql sql-server unpivot

试图使Unpivot应用于多个列,并且正在努力使其正常工作。也许它不是正确的解决方案,所以绝对可以接受建议。这是我的数据集的一个例子

Sample Data Set In Excel

Sample Wanted Data Set In Excel

很抱歉,这些链接还不能完全在这些帖子中贴上图片。

这是我接近的代码,好像我已经接近了……但也许没有。

SELECT 
    RunDate,
    ShipMode,
    Amt
FROM
    (SELECT
         CAST(sh.RunDt as DATE) as RunDt,
         sh.method1, sh.method2, sh.method3,
         sh.method4, sh.method5
     FROM 
         [dbo].sampletable sh
     WHERE 
         RunDt = '2016-10-17') AS P
UNPIVOT (
    RunDate FOR ShipMode IN(method1, method2, method3,method4, method5)
) AS Unpvt

2 个答案:

答案 0 :(得分:2)

您的几个名字有误。您可以使用SQL取消透视:

SELECT 

RunDt ,ShipMode ,Amt FROM (

 SELECT 
 CAST(sh.RunDt as DATE) as RunDt
,sh.method1 
,sh.method2 
,sh.method3  
,sh.method4 
,sh.method5
FROM [dbo].sampletable  sh
WHERE RunDt = '2018-10-17'

) AS P UNPIVOT ( Amt FOR ShipMode IN(method1, method2, method3,method4, method5) ) as Unpvt

答案 1 :(得分:1)

另一个选择是使用CROSS APPLY,而不是UNPIVOT。它提供了更多的灵活性

示例

Select A.RunDt
      ,B.*
 From  YourTable A
 Cross Apply ( values ('Method1',Method1)
                     ,('Method2',Method2)
                     ,('Method3',Method3)
                     ,('Method4',Method4)
                     ,('Method5',Method5)
             ) B(Overall,Amt)
 Where RunDt = '2016-10-17'