Нужна помощь в повороте некоторых данных - PullRequest
1 голос
/ 20 октября 2011

Я надеюсь, что кто-то может мне помочь.Я пытаюсь перенести некоторые данные на SQL Server 2005 и не могу получить требуемые результаты.

Это моя текущая схема таблицы:

| ProductCode | AttributeName | AttributeValue |
| 1           | AttributeA    | 10             |
| 1           | AttributeB    | 20             |
| 2           | AttributeA    | 30             |
| 2           | AttributeB    | 40             |
| 3           | AttributeA    | 50             |

Эторезультаты, которые я пытаюсь достичь:

| ProductCode | AttributeA | AttributeB |
| 1           | 10         | 20         |
| 2           | 30         | 40         |
| 3           | 50         | NULL       |

Я знаю, что могу достичь этого результата с помощью следующего SQL:

SELECT DISTINCT ProductCode, 
    (SELECT AttributeValue 
     FROM attributes 
     WHERE ProductName = 'AttributeA' AND ProductCode=a.ProductCode) AttributeA, 
    (SELECT AttributeValue 
     FROM attributes 
     WHERE ProductName = 'AttributeB' AND ProductCode=a.ProductCode) AttributeB, 
FROM attributes a

Хотя этот SQL действительно дает результат, яЭто очевидно, что он не динамический (на самом деле у меня есть не только больше типов атрибутов, но и у разных продуктов разные наборы атрибутов), и он также сканирует таблицу 3 раза.Это также кошмар обслуживания.

Я пытался использовать функциональность PIVOT SQL Server, но безуспешно.

Кто-нибудь может помочь?

1 Ответ

0 голосов
/ 21 октября 2011
create table #attributes (ProductCode int, 
                          AttributeName varchar(20), 
                          AttributeValue int)

insert into #attributes values (1, 'AttributeA', 10)
insert into #attributes values (1, 'AttributeB', 20)
insert into #attributes values (2, 'AttributeA', 30)
insert into #attributes values (2, 'AttributeB', 40)
insert into #attributes values (3, 'AttributeA', 50)

declare @attributes_columns nvarchar(max)

set @attributes_columns
   = (
    select ', [' + AttributeName + ']'
    from 
    (
        select distinct AttributeName as AttributeName
        from #attributes
    ) t
    order by t.AttributeName
    for xml path('')
   )
set @attributes_columns = stuff(@attributes_columns,1,2,'')

declare @sql nvarchar(max) 
set @sql = N'
select ProductCode, <attributes_columns>
from
 (select ProductCode, AttributeName, AttributeValue
  from #attributes )p
 pivot 
 (
   sum(AttributeValue) for AttributeName in (<attributes_columns>)
 ) as pvt
'
set @sql = replace(@sql, '<attributes_columns>', @attributes_columns)
print @sql
exec sp_executesql @sql
drop table #attributes
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...