Max in SQL server

Ich versuche das in meiner Abfrage zu verwenden:

MAX(CASE WHEN year = 2014 THEN remark ELSE '-' END) 

Tischprobe:

  EmpID Year Remark 1 2016 Normal 1 2014 Good 1 2015 Very Good 1 2016 Good 1 2010 Poor 1 2016 Well 

Bericht, den ich bekomme:

 EmpID 2010 2014 2015 2016 1 Poor Good Very Good Normal 

Bericht, den ich eigentlich möchte:

 EmpID 2010 2014 2015 2016 1 Poor Good Very Good Normal - Good - Well 

Wenn ich die Abfrage anrufe, bekomme ich nur eine Zeile, aber ich möchte jede Zeile für das jeweilige Jahr verketten.

Wie es geht ?

Danke im Voraus

Es ist nichts mit dem MAX zu tun, weil man schwenkbar + STUFF mit FOR XML PATH verwenden kann:

 SELECT * FROM ( SELECT DISTINCT t.EmpID, t.[Year], STUFF(( SELECT '-'+Remark FROM YourTable WHERE t.EmpID = EmpID AND t.[Year] = [Year] FOR XML PATH('') ),1,1,'') Remark FROM YourTable t ) as d PIVOT ( MAX(Remark) FOR [Year] IN ([2010],[2014],[2015],[2016]) ) as pvt 

In d Teil get:

 EmpID Year Remark 1 2010 Poor 1 2014 Good 1 2015 Very Good 1 2016 Normal-Good-Well 
  • STUFF wird verwendet, um erste,

  • FOR XML PATH verwendet, um Werte aus den Zeilen als 1 Zeile zu machen,

  • PIVOT , um Zeilen in Spalten umzuwandeln

Ausgabe:

 EmpID 2010 2014 2015 2016 1 Poor Good Very Good Normal-Good-Well 

BEARBEITEN # 1

Ein anderer path mit MAX und CASE WHEN (gleiche Ausgabe):

 SELECT EmpID, MAX(CASE WHEN [Year] = 2010 THEN Remark END) as [2010], MAX(CASE WHEN [Year] = 2014 THEN Remark END) as [2014], MAX(CASE WHEN [Year] = 2015 THEN Remark END) as [2015], MAX(CASE WHEN [Year] = 2016 THEN Remark END) as [2016] FROM ( SELECT DISTINCT t.EmpID, t.[Year], STUFF(( SELECT '-'+Remark FROM YourTable WHERE t.EmpID = EmpID AND t.[Year] = [Year] FOR XML PATH('') ),1,1,'') Remark FROM YourTable t ) as d GROUP BY EmpID 

EDIT # 2

Dynamisches SQL:

 DECLARE @sql nvarchar(max), @col nvarchar(max) SELECT @col = ( SELECT DISTINCT ','+QUOTENAME([Year]) FROM YourTable FOR XML PATH('') ) SELECT @sql = N' SELECT * FROM ( SELECT DISTINCT t.EmpID, t.[Year], STUFF(( SELECT ''-''+Remark FROM YourTable WHERE t.EmpID = EmpID AND t.[Year] = [Year] FOR XML PATH('''') ),1,1,'''') Remark FROM YourTable t ) as d PIVOT ( MAX(Remark) FOR [Year] IN ('+STUFF(@col,1,1,'')+') ) as pvt' EXEC sp_executesql @sql 

Sie können so abfragen

 ;WITH cte AS (SELECT empid, year, STUFF((SELECT ' - ' + remark FROM #table WHERE empid = t.empid AND year = t.year FOR xml PATH ('')), 1, 3, '') AS testRemark FROM #table t GROUP BY empid, year) SELECT * FROM cte PIVOT (MAX(testRemark) FOR year IN ([2010], [2014], [2015], [2016])) p 

Ausgabe:

 empid 2010 2014 2015 2016 1 Poor Good Very Good Normal - Good - Well 
 SELECT Chars = STUFF(( SELECT ', ' + [Char] FROM dbo.Chars FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 2, '') 

Oben kann verwendet werden, um Werte in ein einzelnes Feld zu konfizieren. Integriere dies in deiner Abfrage mit einer Gruppe auf Jahr.

Quelle: http://www.codeproject.com/Articles/691102/String-Aggregation-in-die-World-of-SQL-server

Ich vermute, Sie können Ihre Saite so verketten:

 SELECT T.EmpID , T.[Year] , STUFF(T2.[Remark], 1, 3, '') AS Remark FROM (SELECT DISTINCT EmpID, [Year] FROM #Test) AS T CROSS APPLY ( SELECT CONCAT(' - ', T2.Remark) FROM #Test AS T2 WHERE T2.EmpID = T.EmpID AND T2.[Year] = T.[Year] FOR XML PATH ('') ) AS T2(Remark); 

Die obige Abfrage wird ausgegeben:

 ╔═══════╦══════╦══════════════════════╗ ║ EmpID ║ Year ║ Remark ║ ╠═══════╬══════╬══════════════════════╣ ║ 1 ║ 2010 ║ Poor ║ ║ 1 ║ 2014 ║ Good ║ ║ 1 ║ 2015 ║ Very Good ║ ║ 1 ║ 2016 ║ Normal - Good - Well ║ ╚═══════╩══════╩══════════════════════╝ 

Jetzt musst du es nur auf der Grundlage von EmpID und Year Werten platzieren, die du bereits auf deiner Kommentare EmpID .