我有以下数据,
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)
取而代之的是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值作为结果。