SQL 服务器组枢轴 table 根据 id

SQL Server group pivot table according to id

我有一个 table 叫 'info':

|InfoId   | OtherId | Year | InfoNo |
-------------------------------------
|1        | 1       | 2012 | abc    |
|2        | 1       | 2013 | def    |
|3        | 1       | 2014 | ghi    |

我想得到这个结果:

| OtherId   | 2012 | 2013 | 2014 |
---------------------------------
|   1       | abc  | def  | ghi  |

我尝试使用:

SELECT * 
FROM info
PIVOT (MAX(InfoNo) 
       FOR Year in ([2012],[2013],[2014])) AS pvt
       where OtherId= '1'

但是,我得到了这个结果:

| OtherId   | 2012 | 2013 | 2014 |
---------------------------------
|   1       | abc  |       |     |
|   1       |      | def   |     |
|   1       |      |       | ghi |

如何根据'OtherId'将三行分组为一行?

编辑

我将 SQL 更新为以下内容并设法获得了我想要的结果:

SELECT 
OtherId,
MAX(case WHEN Year = '2012' THEN InvoiceNo ELSE NULL end) AS [2012],
MAX(case WHEN Year = '2013' THEN InvoiceNo ELSE NULL end) AS [2013],
MAX(case WHEN Year = '2014' THEN InvoiceNo ELSE NULL end) AS [2014]
FROM info

谢谢大家的帮助。

您需要按 OtherId 对结果进行分组,我进行了快速测试,结果如下:

Select * FROM info

InfoId      OtherId     Year        InfoNo
----------- ----------- ----------- ----------
1           1           2012        abc       
2           1           2013        edf       
3           1           2014        ghk

SELECT 
    pvt.OtherId, 
    MAX([2012]) AS '2012', 
    MAX([2013]) AS '2013', 
    MAX([2014]) AS '2014' 
FROM info AS src
PIVOT (
    MAX(InfoNo) 
    FOR [Year] IN ([2012],[2013],[2014])) 
    AS pvt
GROUP BY pvt.OtherId

Result:
OtherId     2012       2013       2014
----------- ---------- ---------- ----------
1           abc        edf        ghk       

希望对您的事业有所帮助。

IF OBJECT_ID('Tempdb..#Temp') IS NOt NUll
Drop Table #Temp

;With cte(InfoId ,OtherId ,[Year],InfoNo)
AS
(
SELECT 1,1,'2012' , 'abc' Union all
SELECT 2,1,'2013' , 'def'   Union all
SELECT 3,1,'2014' , 'ghi'
)
SELECT * INTO #Temp FROM cte


DECLARE @dynamicCol nvarchar(max),@dynamicCol2 nvarchar(max),
        @Sql nvarchar(max)

SELECT @dynamicCol=STUFF((SELECT DISTINCT ', ' + QUOTENAME(Year)  FROM  #Temp
FOR XML PATH('')),1,1,'')

SELECT @dynamicCol2=STUFF((SELECT DISTINCT ', ' + 'MAX('+ QUOTENAME(Year) +' )' +'  AS '+ QUOTENAME(Year)  FROM  #Temp
FOR XML PATH('')),1,1,'')



SET @Sql= N' SELECT [OtherId] , '+ @dynamicCol2 +' From
             (
                SELECT InfoId ,OtherId ,[Year],InfoNo From
                #temp
              )AS Src
                PIVOT 
                    (
                    MAX([InfoNo]) For [Year] IN ('+@dynamicCol+')
                    )
            AS Pvt
            GROUP BY Pvt.OtherId
            '

PRINT @Sql

EXEC(@Sql)

输出

| OtherId   | 2012 | 2013 | 2014 |
---------------------------------
|   1       | abc  | def  | ghi  |