Как сделать Row as Column в моем случае в SQL Server? - PullRequest
1 голос
/ 13 июня 2019

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

ProductPast

productID   deptID    year   month    price
-------------------------------------------
1           10        2015   1        45
1           10        2015   2        65


2           11        2015   1        45
2           11        2015   2        65
2           11        2015   3        44

ProductCurrent

productID   deptID    year   month    price
-------------------------------------------
1           10        2016   1        12
1           10        2016   2        46
1           10        2016   3        77

2           11        2016   1        88

Ожидаемый результат

productID   deptID    Month    PrevYear   PrevPrice    CurrYear    CurrPrice
-----------------------------------------------------------------------------------------
1           10          1       2015        45          2016            12
1           10          2       2015        65          2016            46
1           10          3       2015        0           2016            77

2           11          1       2015        45           2016            88
2           11          1       2015        65           2016            0
2           11          1       2015        44           2016            0

Я пытался сделать unionall и сгруппировать, как показано ниже, в своей хранимой процедуре

SELECT ProductID,DeptID,month
into #rec
FROM (
    SELECT ProductID,DeptID,year,month FROM ProductPast
    UNION ALL
    SELECT ProductID,DeptID,year,month FROM ProductCurrent
    )
group by ProductID,DeptID,month


SELECT ProductID,DeptID,month,p.year as PrevYear, c.year as CurrYear, p.price as prevprice,c.price as currprice
FROM rec
LEFT JOIN ProductPast p on p.productid = rec.productID and p.month = rec.month
LEFT JOIN ProductCurrent c on c.productid = rec.productID and c.month = rec.month

, но я не получил точный результат.

1 Ответ

5 голосов
/ 13 июня 2019

На самом деле полное внешнее объединение может показаться тем, что вам нужно:

SELECT
    COALESCE(pp.productID, pc.productID) AS productID,
    COALESCE(pp.deptID, pc.deptID) AS deptID,
    COALESCE(pp.month, pc.month) AS Month,
    COALESCE(pp.year, 2015) AS PrevYear,
    COALESCE(pp.price, 0) AS PrevPrice,
    COALESCE(pc.year, 2016) AS CurrYear,        
    COALESCE(pc.price, 0) AS CurrPrice
FROM ProductPast pp
FULL OUTER JOIN ProductCurrent pc
    ON pp.productID = pc.productID AND
       pp.deptID = pc.deptID AND
       pp.year = pc.year - 1 AND
       pp.month = pc.month
ORDER BY
    COALESCE(pp.productID, pc.productID),
    COALESCE(pp.deptID, pc.deptID),
    COALESCE(pp.month, pc.month);

enter image description here

Демо

Обратите внимание, что другим способом сделать это было бы использование таблицы календаря, содержащей все годы и месяцы (а также, возможно, продукты и отделы).Затем вы можете просто выполнить серию регулярных внутренних / левых соединений, чтобы получить желаемый результат.

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