直方图:在SQL中使用变量箱计数订单

时间:2015-04-25 15:03:03

标签: sql

我有一张包含订单,商品和价格的表格。我试图根据价格为每个项目生成直方图。

Create Table #Customer_Pricing
(
customer_id int,
item_id VARCHAR(10),
qty DECIMAL(5,2),
price DECIMAL(5,2),
)
;
GO

-- Insert Statements
Insert into #Customer_Pricing values(128456, 'SOM 555', 8, 2.50)
Insert into #Customer_Pricing values(123856, 'SOM 554', 1, 2.50)
Insert into #Customer_Pricing values(123456, 'SOM 554', 55, 2.00)
Insert into #Customer_Pricing values(123556, 'SOM 555', 2, 2.20)
Insert into #Customer_Pricing values(123456, 'SOM 553', 12, 2.13)
;

对于每个项目,我想要3个箱子,所以我通过将MAX-MIN的差值除以3来确定箱子大小,然后将该值加到MIN。

WITH Stats_Table_CTE (item_id2,max_p, min_p, int_p, r1_upper, r2_lower, r2_upper, r3_lower)
AS
(   SELECT  item_id
            ,max(price) 
            ,min(price)
            ,(max(price) - min(price))/3
            ,min(price)+(max(price) - min(price))/3-0.01
            ,min(price)+(max(price) - min(price))/3         
            ,min(price)+((max(price) - min(price))/3)*2-0.01
            ,min(price)+((max(price) - min(price))/3)*2                                             
        FROM #Customer_Pricing
        GROUP BY item_id)

现在,我需要计算每个范围和每个项目的频率。我尝试使用SUM(CASE ...)但是没有成功。

SELECT item_id
    ,SUM(CASE WHEN price <= r1_upper, THEN 1 ELSE 0 END) AS r1_count
    ,SUM(CASE WHEN price >= r2_lower AND <= r2_upper, THEN 1 ELSE 0 END) AS r2_count
    ,SUM(CASE WHEN price >= r3_lower, THEN 1 ELSE 0 END) AS r3_count
FROM Stats_Table_CTE
GROUP BY item_id

我还尝试在表单中使用COUNT     SELECT item_id,价格         count(价格&lt; = r1_upper)AS r1_count ....但我卡住了

在一次尝试中,INNER加入了#Customer_Pricing表和Stats_Table_CTE,但不知道从那里去哪里。

理想情况下,我希望输出表如下所示:*这不是实际数据,但我将其包含在内以显示所需的输出格式。     物料ID min_p r1_upper(r2箱)r3_lower max_p r1_count r2_ct     SOM 553 2.00 2.16 节省空间 2.33 2.50 2 1     SOM 554 2.13 2.48 2.88 3.25 1 0     SOM 555 2.31 2.51 2.72 2.92 3 2

*输出表的格式已关闭,但我有项目ID,分档和顶部按项目分组的计数

1 个答案:

答案 0 :(得分:1)

以下是我的建议:

WITH Stats_Table_CTE AS (
    SELECT  item_id, max(price) as maxprice, min(price) as minprice,
            (max(price) - min(price))/3 as binsize
    FROM #Customer_Pricing
    GROUP BY item_id
   )
SELECT cp.item_id,
     SUM(CASE WHEN price < minprice + binsize THEN 1 ELSE 0
         END) AS r1_count
     SUM(CASE WHEN price >= minprice + binsize AND price < minprice+ 2*binsize
              THEN 1 ELSE 0
         END) AS r2_count
     SUM(CASE WHEN price >= minprice + 2*binsize
              THEN 1 ELSE 0
         END) AS r3_count
FROM #Customer_Pricing cp JOIN
     Stats_Table_CTE st
     ON st.item_id = cp.item_id
GROUP BY cp.item_id

重要的部分是加入#Customer_Pricing。同样重要的是简化逻辑 - 您可以定义bin的边界并使用<,而不是每个都有一个下限和上限。此外,您的查询中存在一些语法错误。

请注意,在许多数据库中,CTE不是必需的,因为您可以只使用窗口函数。你的问题没有用数据库标记(虽然我可以猜到它是什么),所以这种改变似乎是没有根据的。