MS-SQL Pivot по двум столбцам - PullRequest
       9

MS-SQL Pivot по двум столбцам

0 голосов
/ 28 сентября 2018

Я получил следующие данные в базе данных MS-SQL

Manufacturer|Model|Location|Inventory|Sold
------------|-----|--------|---------|-----
Alpha       |One  |USA     |3000     |123
Alpha       |One  |UK      |2300     |53
Beta        |Two  |USA     |1300     |45
Beta        |Two  |UK      |620      |12
Gamma       |Three|USA     |520      |155
Gamma       |Three|UK      |250      |19

Я хотел бы получить

Manufacturer|Model|Inventory UK|Sold UK|Inventory USA|Sold USA
------------|-----|------------|-------|-------------|--------
Alpha       |One  |2300        |53     |3000         |123
Beta        |Two  |620         |12     |1300         |45
Gamma       |Three|250         |19     |520          |155

Если я правильно понимаю, я должен дважды поворачиваться, но в настоящее времяЯ застрял в том, как получить это

SELECT *
FROM Data
PIVOT (max([Inventory]) FOR Location IN ([UK],[USA])) Piv1
PIVOT (max([Sold]) FOR Location IN ([UK],[USA])) Piv2
group by Manufacturer,Model,..?

, но, конечно, я все еще далек от понимания, как мне поступить.Может кто-нибудь, пожалуйста, помогите мне?Большое спасибо

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

Вы можете сделать это, выполнив динамический SQL-запрос.

Запрос

declare @sql as varchar(max);

select @sql = 'select [Manufacturer], [Model], ' + stuff((
        select distinct ',sum(case [Location] when ' + char(39) + [Location] + char(39) 
        + ' then [Inventory] end) as [Inventory_' + [Location] + ']'
        + ',sum(case [Location] when ' + char(39) + [Location] + char(39) 
        + ' then [Sold] end) as [Sold_' + [Location] + ']'
        from [your_table_name]
        for xml path('')
    )
    , 1, 1, ''
);

select @sql += 'from [your_table_name] group by [Manufacturer], [Model];';

exec(@sql);

Find a demo here

0 голосов
/ 28 сентября 2018

Вот один из способов сделать это напрямую с помощью оператора PIVOT SQL Server:

SELECT
    Manufacturer,
    Model,
    MAX(UK) AS [Inventory UK],
    MAX(UK1) AS [Sold UK],
    MAX(USA) AS [Inventory USA],
    MAX(USA1) AS [Sold USA]
FROM
(
    SELECT Manufacturer, Model, Location, Location + '1' AS Location1, Inventory, Sold
    FROM Data
) AS P
PIVOT (MAX([Inventory]) FOR Location IN ([UK],[USA])) Piv1
PIVOT (MAX([Sold]) FOR Location1 IN ([UK1],[USA1])) Piv2
GROUP BY Manufacturer, Model
ORDER BY Manufacturer;

enter image description here

Демонстрация

0 голосов
/ 28 сентября 2018

Вы можете использовать условное агрегирование для поворота ваших данных:

declare @tmp table(Manufacturer varchar(50), 
                   Model varchar(50), Location varchar(50), Inventory int, Sold int)

insert into @tmp values
 ('Alpha','One'  ,'USA',3000  ,123)
,('Alpha','One'  ,'UK' ,2300  ,53 )
,('Beta ','Two'  ,'USA',1300  ,45 )
,('Beta ','Two'  ,'UK' ,620   ,12 )
,('Gamma','Three','USA',520   ,155)
,('Gamma','Three','UK' ,250   ,19 )

select Manufacturer, Model
,sum (case when Location ='UK' then Inventory else 0 end) as Inventory_UK
,sum (case when Location ='UK' then Sold else 0 end) as Sold_UK
,sum (case when Location ='USA' then Inventory else 0 end) as Inventory_USA
,sum (case when Location ='USA' then Sold else 0 end) as Sold_USA

from @tmp 
group by Manufacturer, Model
order by Manufacturer, Model

Результаты:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...