2011-01-12 6 views
0

Ich habe eine TabelleInvertierung Spalten-Header in SQL Zeile

ID Productcode AttName Attval 
1 IPHONE  Color Black 
2 IPHONE  Bluetooth Yes 
3 IPHONE  Camera Yes 
4 MOTV   Color Silver 
5 MOTV   Bluetooth No 
6 MOTV   Camera No 

I

IPHONE Color Black Bluetooth Yes Camera Yes 
MOTV Color Silver Bluetooth No Camera No 

Ist dies möglich mit Schwenk- oder anderen Verfahren zur Erzeugung benötigen?

Wir SQL 2005 Dank

Scripts

Create TAble TempInve(ID INT Identity(1,1),Productcode VARCHAR(40),AttName VARCHAR(40),Attval VARCHAR(50)) 
INSERT INTO TempInve 
SELECT 'IPHONE','Color','Black' UNION ALL 
SELECT 'IPHONE','Bluetooth','Yes' UNION ALL 
SELECT 'IPHONE','Camera','Yes' 


INSERT INTO TempInve 
SELECT 'MOTV','Color','Silver' UNION ALL 
SELECT 'MOTV','Bluetooth','No' UNION ALL 
SELECT 'MOTV','Camera','No' 
+0

Ja Sie können dies mit Pivot tun. Sind die Attribute eine feste Liste? Wenn nicht, würden Sie dynamisches SQL benötigen. –

+0

Sind Sie nach dem Attribut als Spalte * sowie * der Wert angezeigt, so gibt es 7 Spalten in der Ausgabe? – RichardTheKiwi

+0

Martin - Die Attributliste ist nicht festgelegt. Cyberkiwi- Ja. Musste dynamische SQL verwenden, um es zu bekommen. – JoR

Antwort

2

für IPHONE verwenden:

DECLARE @result VARCHAR(MAX) = 'IPHONE ' 

SELECT @result += AttName + ' ' + Attval + ' ' 
FROM TempInve 
WHERE productCode = 'IPHONE' 

SELECT @result 

, wenn Sie den Cursor und wählen Sie alle verschiedene product verwenden, können Sie leicht für all dies tun ...

+1

Danke. Keine der Pivot-Lösung funktioniert. Musste dynamische Abfrage verwenden. Musste deine Abfrage optimieren, um das Ergebnis zu erhalten. – JoR

2
SELECT Productcode, 
     MAX(CASE WHEN AttName='Color' THEN Attval END) AS Attval, 
     MAX(CASE WHEN AttName='Bluetooth' THEN Attval END) AS Bluetooth, 
     MAX(CASE WHEN AttName='Camera' THEN Attval END) AS Camera 
FROM TempInve 
GROUP BY Productcode 

Oder

;WITH T 
    AS (SELECT Productcode, 
       AttName, 
       Attval 
     FROM TempInve) 
SELECT * 
FROM T PIVOT(max (Attval) FOR AttName IN ([Color], [Bluetooth], [Camera])) 
     AS pvt 
1

Wenn Ihre Attributnamen ändern sich ständig oder sind nicht statisch, dann können Sie diese verwenden

declare @sql nvarchar(max); 

-- generate the column names 
select @sql = coalesce(@sql + ',', '') + QuoteName(AttName) 
from (select distinct AttName from TempInve) T; 

-- replace the column names into the generic PIVOT form 
set @sql = REPLACE(' 
select ProductCode, :columns: 
from (select Productcode, AttName, Attval From TempInve) p 
pivot (max(attval) for attname in (:columns:)) pv', 
':columns:', @sql) 

-- execute for the results 
exec (@sql)