我经常发现,当我拉取数据进行分析时,我会将客户下的订单数分组到不同的范围中,例如:
1-2
3-5
6-9
10-12
13-15
我用一个CASE函数来做这件事。但是,当您获得查询结果时,订单范围将如下所示:
1-2
10-12
13-15
3-5
6-9
当您有一个查询和几个订单范围组时,这很容易在Excel中更正。然而,当您拉取许多查询时,一遍又一遍地纠正它是一件痛苦的事情。
拉取范围并正确排序的最好方法是什么?
下面是我要编写的查询示例:
SELECT
OrderRange = CASE
WHEN COUNT(OrderID) BETWEEN 1 AND 5 THEN '1-5'
WHEN COUNT(OrderID) BETWEEN 6 AND 10 THEN '6-10'
WHEN COUNT(OrderID) > 10 THEN '10+'
ELSE 'Error'
END
FROM Orders
GROUP BY CASE
WHEN COUNT(OrderID) BETWEEN 1 AND 5 THEN '1-5'
WHEN COUNT(OrderID) BETWEEN 6 AND 10 THEN '6-10'
WHEN COUNT(OrderID) > 10 THEN '10+'
ELSE 'Error'
END
ORDER BY... ?发布于 2011-12-24 06:47:28
我会保留一个范围表,例如(未写入索引)
CREATE TABLE Ranges (RangeSet int, MinVal int, MaxVal int, Name varchar(50));然后,例如
INSERT INTO ranges VALUES
(1,1,5,'1-5'),(1,6,10,'6-10'),(1,11,-1,'11+'),
(2,1,10,'1-10'),(2,11,20,'11-20'),(2,21,30,'21-30'),(2,31,-1,'31+');你明白了吧。现在你做一些类似的事情(表名和字段名,免费虚构)
SELECT
CustomerID,
count(OrderID) AS OrderCount
FROM Orders
WHERE <whatever, e.g order_date BETWEEN ... AND ...>
GROUP BY CustomerID
HAVING OrderCount>0正如您通常所期望的那样,但将其包装在连接到Ranges表的超级查询中
SELECT
BaseView.CustomerID as CustomerID,
Ranges.Name as OrderRange
FROM (
SELECT
CustomerID,
count(OrderID) AS OrderCount
FROM Orders
WHERE <whatever, e.g order_date BETWEEN ... AND ...>
GROUP BY CustomerID
HAVING OrderCount>0
) AS BaseView
INNER JOIN Ranges ON
Ranges.RangeSet=<id-of-required-rangeset>
AND BaseView.OrderCount>=Ranges.MinVal
AND (BaseView.OrderCount<=Ranges.MaxVal OR Ranges.MaxVal=-1)
ORDER BY RangeSet.MinVal DESC
;现在你只需要提供你想要应用的RangeSet,也许有时会创建一个新的。
免责声明:这是一个性能杀手
发布于 2011-12-25 00:15:47
如果我理解正确的话,您希望客户列表和订单范围从最小到最高排序。只需按计数排序(OrderID)就可以做到这一点
SELECT CustomerID,
OrderRange = CASE
WHEN COUNT(OrderID) BETWEEN 1 AND 5 THEN '1-5'
WHEN COUNT(OrderID) BETWEEN 6 AND 10 THEN '6-10'
WHEN COUNT(OrderID) > 10 THEN '10+'
ELSE 'Error'
END ,
FROM Orders
GROUP BY CustomerID
order by count(orderid)结果:
CustomerId OrderRange
CENTC 1-5
GROSR 1-5
LAZYK 1-5
...
ROMEY 1-5
VINET 1-5
ALFKI 6-10
CACTU 6-10
...
VICTE 6-10
WANDK 6-10
BLONP 10+
GREAL 10+
RICAR 10+
...
QUICK 10+
ERNSH 10+
SAVEA 10+https://stackoverflow.com/questions/8621147
复制相似问题