按订单数量计算销售数量

时间:2019-05-22 17:10:03

标签: sql-server sql-server-2008-r2

我正在使用SQL Server 2008 R2,并对包含CustomerID,OrderAmount,RegionID的表进行分析。我需要根据每个区域中的OrderAmount计算不同类别中的订单数。如果类别中没有销售,则返回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

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

1 个答案:

答案 0 :(得分:0)

要实现的目标需要一个包含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