Здесь используется шаблон 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