Создайте sql pivot на нескольких строках и столбцах - PullRequest
1 голос
/ 23 мая 2019

Я должен объединить в PIVOT несколько столбцов / строк.Позвольте мне объяснить на примере:

Моя стартовая таблица:

PriceListId | ItemId | Stock | PriceIT | PriceES | PriceAT | OriginPriceListId

28 | 25760 | 51 | 46.76 | 49.20 | 44.49 | 301874
36 | 25760 | 51 | 56.76 | 59.20 | 54.49 | 301874
28 | 25761 | 4 | 45.66 | 48.26 | 43.57 | 301875
36 | 25761 | 4 | 55.66 | 58.26 | 53.57 | 301875
28 | 25763 | 100 | 47.97 | 50.57 | 45.70 | 301877
36 | 25763 | 100 | 57.97 | 60.57 | 55.70 | 301877

Как я хочу:

ItemId | Stock | OriginPriceListId| PriceIT_28 | PriceES_28 | PriceAT_28 | PriceIT_36 | PriceES_36 | PriceAT_36 

25760 | 51 | 301874| 46.76 | 49.20 | 44.49 | 56.76 | 59.20 | 54.49 
25761 | 4 | 301875| 45.66 | 48.26 | 43.57 | 55.66 | 58.26 | 53.57
25763 | 100 | 301877| 47.97 | 50.57 | 45.70 | 57.97 | 60.57 | 55.70 

Мой код только для PriceIT:

with pli as (

select PriceListId, ItemId, Stock, PriceIT, OriginPriceListId from dbo.fn_PL_PriceListItems(28) 

union all

select PriceListId, ItemId, Stock, PriceIT, OriginPriceListId from dbo.fn_PL_PriceListItems(36)

) 

select top 10  ItemId, Stock, OriginPriceListId,[28],[36]
from(

select PriceListId, ItemId, Stock, PriceIT,OriginPriceListId from pli

) a
PIVOT (min(PriceIT) FOR PriceListId in ([28],[36])) as pvt

Результат:

ItemId |Stock   | OriginPriceListId | 28 | 36

124315 | 8 | 860680 | 120.79 | 120.7

124314 | 8 | 860679 | 301.75 | 301.75

124313 | 33 | 860678 | 44.51 | 44.51

1 Ответ

0 голосов
/ 23 мая 2019

Я не уверен, как вы получаете данные от вызова функции.Основываясь на ваших требованиях, я создал таблицу и вставил предоставленные вами данные.

CREATE TABLE TESTPRICE
(PriceListId INT, ItemId INT, Stock INT, PriceIT DECIMAL(10,2),
 PriceES DECIMAL(10,2), PriceAT DECIMAL(10,2), OriginPriceListId INT)


INSERT INTO TESTPRICE VALUES
(28, 25760 , 51 , 46.76 , 49.20 , 44.49 , 301874),
(36, 25760 , 51 , 56.76 , 59.20 , 54.49 , 301874),
(28, 25761 , 4 , 45.66 , 48.26 , 43.57 , 301875),
(36, 25761 , 4 , 55.66 , 58.26 , 53.57 , 301875),
(28, 25763 , 100 , 47.97 , 50.57 , 45.70 , 301877),
(36, 25763 , 100 , 57.97 , 60.57 , 55.70 , 301877)

Исходя из ваших требований, я развернул записи, каждая для IT, ES и AT.

with cte1 as(
SELECT pvt.ItemId, pvt.Stock, pvt.OriginPriceListId, pvt.[28] AS 'PriceIT_28', pvt.[36] as 'PriceIT_36' 
FROM(SELECT  ItemId, Stock, OriginPriceListId,PriceIT,PriceListId FROM TestPrice) AS t PIVOT (min (PriceIT) FOR PriceListId IN (  [28],[36])) AS pvt),

cte2 as(
SELECT pvt.ItemId, pvt.Stock, pvt.OriginPriceListId, pvt.[28] AS 'PriceAT_28', pvt.[36] as 'PriceAT_36' 
FROM(SELECT  ItemId, Stock, OriginPriceListId,PriceAT,PriceListId FROM TestPrice) AS t PIVOT (min (PriceAT) FOR PriceListId IN (  [28],[36])) AS pvt),

cte3 as(
SELECT pvt.ItemId, pvt.Stock, pvt.OriginPriceListId, pvt.[28] AS 'PriceES_28' , pvt.[36] 'PriceES_36' 
FROM(SELECT  ItemId, Stock, OriginPriceListId,PriceES,PriceListId FROM TestPrice) AS t PIVOT (min (PriceES) FOR PriceListId IN (  [28],[36])) AS pvt)

SELECT DISTINCT a.ItemId, a.Stock, a.OriginPriceListId, PriceIT_28, PriceES_28, PriceAT_28, PriceIT_36, PriceES_36, PriceAT_36
FROM cte1 a join cte2 b  ON a.ItemId=b.ItemId 
JOIN cte3 c ON b.ItemId=c.ItemId

Используя приведенный выше запрос, я получаю желаемый результат.Дайте мне знать, если у вас есть какие-либо проблемы с пониманием.

ItemId  Stock   OriginPriceListId   PriceIT_28  PriceES_28  PriceAT_28  PriceIT_36  PriceES_36  PriceAT_36
25760   51      301874              46.76        49.20       44.49       56.76       59.20      54.49
25761   4       301875              45.66        48.26       43.57       55.66       58.26      53.57
25763   100     301877              47.97        50.57       45.70       57.97       60.57      55.70
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...