按订单金额统计销售数量

Count number of sale by order amount

我正在使用 SQL Server 2008 R2 并对包含 CustomerID、OrderAmount、RegionID 的 table 进行分析。我需要根据每个地区的OrderAmount统计不同类别的订单数量。如果该类别没有销售,returns 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.如何将return0放在空的类别上? 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

因此,我使用这些代码并得到了我的结果,但是在 801 区域的 100-200 类别中计数没有 return 0。

table 持有 RegionID 和 CategoryID 是您想要实现的目标所必需的。然后我们可以使用 table 进行连接,如下所示。

 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