首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >直方图:在SQL中使用变量桶计数顺序

直方图:在SQL中使用变量桶计数顺序
EN

Stack Overflow用户
提问于 2015-04-25 15:03:03
回答 1查看 634关注 0票数 0

我有一张列有订单、物品和价格的桌子。我正试图根据价格为每个项目生成柱状图。

代码语言:javascript
复制
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个垃圾箱,所以我决定了垃圾箱的大小,方法是将最大值的差值除以3,然后把这个值加到最小。

代码语言:javascript
复制
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.)来做。但没有成功。

代码语言:javascript
复制
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

我还试图在表单中使用item_id,价格计数(价格<= r1_upper)作为r1_count.但我被困住了

在一次尝试中,内部JOINed -- #Customer_Pricing表和Stats_Table_CTE --但不知道从那里到哪里。

理想情况下,我希望输出表显示如下:*这不是实际数据,但我将其包括进来以显示所需的输出格式。项目ID min_p r1_upper (r2 bins) 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.88 3.25 1 0 SOM 555 2.31 2.512.72 2.92 3 2

*输出表的格式为off,但我有项ID、回收箱和顶部按项目分组的计数

EN

回答 1

Stack Overflow用户

发布于 2015-04-25 15:12:54

以下是我的建议:

代码语言:javascript
复制
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。同样重要的是简化逻辑--您可以为回收箱定义边界并使用<,而不是为每个桶定义下限和上限。另外,您的查询中有一些语法错误。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29866841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档