【问题标题】:Count number of sale by order amount按订单金额计算销售数量
【发布时间】:2019-10-09 05:45:45
【问题描述】:

我正在使用 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。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 谢谢,@skimad,这比使用 union 要好得多。类别和区域比较多,所以我使用变量表或临时表来存储它们并混合它们。 ``` DECLARE @CategoryTable TABLE (CategoryID INT, CategoryName VARCHAR(20)) INSERT INTO @CategoryTable VALUES (1,'Below 100') INSERT INTO @CategoryTable VALUES (2,'100-200') DECLARE @RegionTable TABLE (Region_ID INT, Region_Name VARCHAR(20)) INSERT INTO @RegionTable VALUES (801,'City1') INSERT INTO @RegionTable VALUES (802,'City2') WITH BaseTable AS(SELECT * FROM @CategoryTable, @RegionTable) ```跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 2019-08-22
    相关资源
    最近更新 更多