Получите товар в виде SQL SERVER - PullRequest
0 голосов
/ 05 марта 2020

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

У меня есть данные ниже.

Declare @table table (Commodity Varchar(10),Sales int,YearOfSale INT)
INSERT INTO @Table
Values('Samsung',300,2020)
,('OPPO',500,2020)
,('NOKIA',700,2020)
,('OPPO',1000,2020)
,('REDMI',100,2029)
,('KORBON',90,2019)

Я хочу получить результат ниже.

Commodity   TOTALSALES  YearOfSale
----------------------------------
OPPO            1500    2020
NOKIA           700     2020
Samsung         300     2020
REDMI           NULL    2020
KORBON          NULL    2020

Я пробовал ниже

;WITH Commodity
AS (
    SELECT DISTINCT Commodity
        ,YearOfSale
    FROM @Table
    )
    ,Sales
AS (
    SELECT Commodity
        ,SUM(Sales) Sales
        ,YearOfSale
    FROM @Table
    WHERE YearOfsale=2020
    GROUP BY Commodity
        ,YEAROfsale
    )
SELECT P.Commodity
    ,CASE 
                WHEN Sales IS NOT NULL
                    THEN Sales 
                END TOTALSALES
    ,P.YearOfSale
FROM Commodity P
LEFT JOIN Sales QS ON P.Commodity = QS.Commodity
ORDER BY Sales DESC

I Я получаю 2019 год, но мне нужно представить 2020 год. Я был бы очень признателен за помощь.

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

Здесь используется шаблон CROSS JOIN Годы и Товары, чтобы создать строки для каждой комбинации, а затем LEFT JOIN продажи, чтобы заполнить продажи для пар (Товар, Год), которые имеют какие-либо фактические продажи. EG

SELECT P.Commodity, Y.YearOfSale, Sum(S.Sales) TotalSales
FROM Commodity P
CROSS JOIN Years Y
LEFT JOIN @table  S 
  ON P.Commodity = S.Commodity
 AND Y.YearOfSale = S.YearOfSale 
GROUP BY P.Commodity, Y.YearOfSale
ORDER BY TotalSales DESC

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

Declare @table table (Commodity Varchar(10),Sales int,YearOfSale INT)
INSERT INTO @Table
Values('Samsung',300,2020)
,('OPPO',500,2020)
,('NOKIA',700,2020)
,('OPPO',1000,2020)
,('REDMI',100,2029)
,('KORBON',90,2019);


with 
  Commodity as (select distinct Commodity from @table),
  Years as (select distinct YearOfSale from @table)
SELECT P.Commodity, Y.YearOfSale, Sum(S.Sales) TotalSales
FROM Commodity P
CROSS JOIN Years Y
LEFT JOIN @table  S 
  ON P.Commodity = S.Commodity
 AND Y.YearOfSale = S.YearOfSale 
GROUP BY P.Commodity, Y.YearOfSale
ORDER BY TotalSales DESC

output

Commodity  YearOfSale  TotalSales
---------- ----------- -----------
OPPO       2020        1500
NOKIA      2020        700
Samsung    2020        300
REDMI      2029        100
KORBON     2019        90
NOKIA      2019        NULL
OPPO       2019        NULL
REDMI      2019        NULL
Samsung    2019        NULL
KORBON     2020        NULL
KORBON     2029        NULL
NOKIA      2029        NULL
OPPO       2029        NULL
Samsung    2029        NULL
REDMI      2020        NULL
0 голосов
/ 05 марта 2020

Поскольку вас интересуют только продажи в 2020 году, вы можете просто жестко закодировать их в столбце результатов. И вам не нужно YearOfSale в Commodity cte

;WITH Commodity
AS (
    SELECT DISTINCT Commodity
    FROM @Table
    )
    ,Sales
AS (
    SELECT Commodity
        ,SUM(Sales) Sales
        ,YearOfSale
    FROM @Table
    WHERE YearOfSale=2020
    GROUP BY Commodity
        ,YearOfSale
    )
SELECT P.Commodity
    ,Sales
    ,YearOfSale = 2020
FROM Commodity P
LEFT JOIN Sales QS ON P.Commodity = QS.Commodity
ORDER BY Sales DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...