我有一张包含订单,商品和价格的表格。我试图根据价格为每个项目生成直方图。
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,分档和顶部按项目分组的计数
答案 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不是必需的,因为您可以只使用窗口函数。你的问题没有用数据库标记(虽然我可以猜到它是什么),所以这种改变似乎是没有根据的。