Aufteilen von Werten in einer Spalte auf 2 Spalten

Ich muss folgendes in sql machen.

Tabelle 1:

Year Client Investment 1999 X 100 1999 Y 200 2000 X 1000 2000 Y 2000 

Ich möchte es im Unterformat für meinen Bericht anzeigen:

 Client 1999Year 2000Year X 100 1000 

Wie kann ich das machen? Ich verwende SQL server 2008

Bitte helfen Sie.

Hierfür gibt es viele mögliche Lösungen. Einer ist mit MAX() und CASE ,

 SELECT Client, MAX(CASE WHEN YEAR = 1999 THEN Investment END) [1999Year], MAX(CASE WHEN YEAR = 2000 THEN Investment END) [2000Year] FROM TableName WHERE Client = 'X' GROUP BY Client 
  • SQLFiddle Demo

oder mit PIVOT function

 SELECT Client, [1999] AS [1999YEAR], [2000] AS [2000YEAR] FROM ( SELECT YEAR, CLient, Investment FROM TableName WHERE Client = 'X' ) pvt PIVOT ( MAX(InvestMent) FOR YEAR IN ([1999],[2000]) ) s 
  • SQLFiddle Demo

Diese Art der dataumwandlung ist bekannt als ein PIVOT . Einige databaseprodukte haben eine function, die die data von Zeilen zu Spalten umwandelt.

Sie können eine Aggregatfunktion mit einem CASE Ausdruck in einer beliebigen database verwenden:

 select client, sum(case when year = 1999 then investment end) Year_1999, sum(case when year = 2000 then investment end) Year_2000 from yourtable group by client 

Siehe SQL Fiddle mit Demo

Da Sie SQL server 2008 verwenden, können Sie die PIVOT function verwenden, um die data in Spalten umzuwandeln:

 select * from ( select client, 'Year_'+cast(year as varchar(4)) year, investment from yourtable ) src pivot ( sum(investment) for year in (Year_1999, Year_2000) ) piv 

Siehe SQL Fiddle mit Demo .

Die anderen Abfragen funktionieren gut, wenn Sie eine bekannte Anzahl von year haben, aber wenn Sie eine unbekannte Nummer haben, dann möchten Sie dynamisches SQL verwenden:

 DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) select @cols = STUFF((SELECT distinct ',' + QUOTENAME('Year_'+cast(year as varchar(4))) from yourtable FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'') set @query = 'SELECT client,' + @cols + ' from ( select client, ''Year_''+cast(year as varchar(4)) year, investment from yourtable ) x pivot ( sum(investment) for year in (' + @cols + ') ) p ' execute(@query) 

Siehe SQL Fiddle mit Demo .

Dies kann auch getan werden, indem man mehrmals auf den Tisch kommt:

 select t1.client, t1.investment Year_1999, t2.investment Year_2000 from yourtable t1 left join yourtable t2 on t1.client = t2.client and t2.year = 2000 where t1.year = 1999 

Siehe SQL Fiddle mit Demo

Alle Abfragen geben das Ergebnis:

 | CLIENT | YEAR_1999 | YEAR_2000 | ---------------------------------- | X | 100 | 1000 | | Y | 200 | 2000 |