Подсчитать количество продаж по сумме заказа - PullRequest
0 голосов
/ 22 мая 2019

Я использую SQL Server 2008 R2 и выполняю анализ таблицы, содержащей CustomerID, OrderAmount, RegionID. Мне нужно посчитать количество заказов в разных категориях в соответствии с количеством заказов в каждом регионе. И если в категории нет продаж, возвращается 0.

Sample of data:

CustomerID | OrderAmount | RegionID
10001      |     50      |   801
10002      |     25      |   801
10003      |     200     |   802
10001      |     100     |   802
10002      |     20      |   802
...
And my expected result is:

RegionID  |  CategoryID  |  Num_of_Sales
801       |      1       |     2          -----Below 100
801       |      2       |     0          -----100-200
802       |      1       |     2          -----Below 100
802       |      2       |     1          -----100-200
...

Мой вопрос: 1. Как вернуть 0 по пустой категории? 2. Есть ли лучший способ написания кода? (Без использования UNION)

WITH Category1 AS(
	SELECT * FROM Sales_Table 
	WHERE NewAmount <= 100
	)
, Category2 AS(
	SELECT * FROM Sales_Table 
	WHERE NewAmount BETWEEN 101 AND 200
	)
, [...]
SELECT Region_ID, CategoryID, Num_of_Sales
FROM (
	SELECT Region_ID, COUNT(*) AS [Num_of_Sales], 1 AS CategoryID
		FROM Category1
		GROUP BY Region_ID
UNION
	SELECT Region_ID, COUNT(*) AS [Num_of_Sales], 2 AS CategoryID
		FROM Category2
		GROUP BY Region_ID
UNION
	[...]
)z
ORDER BY Region_ID, CategoryID

Итак, я использую этот код и получаю свой результат, но счет не вернул 0 в категории 100-200 в регионе 801.

1 Ответ

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

Таблица, содержащая RegionID и CategoryID, необходима для того, чего вы пытаетесь достичь. Затем мы можем использовать эту таблицу для объединения, как показано ниже.

 With RegCatSales as
    (   
    select RegionID,C,COUNT(*) AS [Num_of_Sales]
        from 
            (
                select RegionID,OrderAmount,
                CASE
                    WHEN OrderAmount <= 100 THEN 1
                    WHEN OrderAmount BETWEEN 101 AND 200 THEN 2
                END as C
                from Sales_Table x  
            ) xx 
        group by RegionID, C
    ), 
    Regions as
    (
        select distinct RegionID from RegCatSales
    ), 
    Categories as 
    (
        select distinct C from RegCatSales
    ), 
    RegCat AS(
        select distinct RegionID, C as CategoryID from Regions,Categories
    )


    select rc.RegionID,rc.CategoryID, ISNULL([Num_of_Sales],0) NUM_Of_Sales  from  
    RegCatSales rcs
    right join RegCat rc
    on rc.RegionID= rcs.RegionID and rc.CategoryID = rcs.C
    order by rc.RegionID, rc.CategoryID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...