Инвертирование столбцов в заголовок строки в sql - PullRequest
0 голосов
/ 13 января 2011

У меня есть таблица

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

Мне нужно сгенерировать

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

Возможно ли это с помощью сводного или любого другого метода?

Мы используем SQL 2005 Спасибо

Скрипты

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' 

Ответы [ 3 ]

2 голосов
/ 13 января 2011

для IPHONE:

DECLARE @result VARCHAR(MAX) = 'IPHONE '

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

SELECT @result

если вы используете курсор и выбираете все различные коды продуктов, вы можете легко сделать это для всех ...

2 голосов
/ 13 января 2011
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

Или

;WITH T
     AS (SELECT Productcode,
                AttName,
                Attval
         FROM   TempInve)
SELECT *
FROM   T PIVOT( max (Attval) FOR AttName IN ( [Color], [Bluetooth], [Camera] ) )
       AS pvt  
1 голос
/ 13 января 2011

Если имена ваших атрибутов постоянно меняются или не являются статичными, вы можете использовать это

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...