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 |
我有一个 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 |