如何旋转多列

pet*_*ter 3 pivot

我有以下数据,

Year        DRC             DISP        Id
0           140.21          0.00        5808
1           112.37          1.00        5808
0           140.21          0.00        5824
1           112.37          0.00        5824
Run Code Online (Sandbox Code Playgroud)

我想像这样旋转它,

Id          DRC Year 0      DISP Year 0     DRC Year 1      DISP Year 1
5808        140.21          0.00            112.37          1.00
5824        140.21          0.00            112.37          0.00
Run Code Online (Sandbox Code Playgroud)

我试过这个,

SELECT *
FROM
(
    SELECT Year, DRC, DISP, ID From OriginalDataTable
) AS SourceTable

PIVOT
(
    max(DRC)
    for Year IN ([0], [1])
) AS PivotTable;
Run Code Online (Sandbox Code Playgroud)

它以 DRC 为中心,但也不以 DISP 为中心。结果是这样的(0,1是DRC值)。我明白为什么会这样,但我如何以 DISP 为中心?

DISP        Id          0           1
0.0         5808        140.21      112.37
0.0         5824        140.21      112.37
Run Code Online (Sandbox Code Playgroud)

Aru*_*mar 6

取而代之的是PIVOT,你可以简单地使用CASE WHEN ...。通过使用GROUP BYthen useMAX(CASE将返回您的预期结果:

使用给定的样本数据执行样本:

DECLARE @OriginalDataTable TABLE (
    [Year] INT, DRC DECIMAL(18,2), DISP DECIMAL(18,2), Id INT);

INSERT INTO @OriginalDataTable ([Year], DRC, DISP, Id) VALUES
(0, 140.21, 0.00, 5808),
(1, 112.37, 1.00, 5808),
(0, 140.21, 0.00, 5824),
(1, 112.37, 0.00, 5824);

SELECT [Id],  
       MAX(CASE WHEN [Year] = 0 THEN DRC END)  AS [DRC Year 0],
       MAX(CASE WHEN [Year] = 0 THEN DISP END) AS [DISP Year 0],
       MAX(CASE WHEN [Year] = 1 THEN DRC END)  AS [DRC Year 1],
       MAX(CASE WHEN [Year] = 1 THEN DISP END) AS [DISP Year 1]
FROM @OriginalDataTable 
GROUP BY [Id]
Run Code Online (Sandbox Code Playgroud)

输出:

Id      DRC Year 0   DISP Year 0   DRC Year 1   DISP Year 1
5808    140.21       0.00          112.37       1.00
5824    140.21       0.00          112.37       0.00
Run Code Online (Sandbox Code Playgroud)

更多解释:

SELECT [Id],  
       CASE WHEN [Year] = 0 THEN DRC END   AS [DRC Year 0],
       CASE WHEN [Year] = 0 THEN DISP END  AS [DISP Year 0],
       CASE WHEN [Year] = 1 THEN DRC END   AS [DRC Year 1],
       CASE WHEN [Year] = 1 THEN DISP END  AS [DISP Year 1]
FROM @OriginalDataTable 
Run Code Online (Sandbox Code Playgroud)

上述查询返回以下结果:

Id      DRC Year 0  DISP Year 0  DRC Year 1  DISP Year 1
5808    140.21      0.00         NULL        NULL
5808    NULL        NULL         112.37      1.00
5824    140.21      0.00         NULL        NULL
5824    NULL        NULL         112.37      0.00
Run Code Online (Sandbox Code Playgroud)

为了避免NULL值和Id明智的结果,我使用了每一列的GROUP BY Idthen MAX(),所以在最终结果中我们可以得到 notNULL值作为结果。