首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用CASE函数进行自定义查询输出排序

使用CASE函数进行自定义查询输出排序
EN

Stack Overflow用户
提问于 2011-12-24 06:25:02
回答 2查看 177关注 0票数 2

我经常发现,当我拉取数据进行分析时,我会将客户下的订单数分组到不同的范围中,例如:

1-2

3-5

6-9

10-12

13-15

我用一个CASE函数来做这件事。但是,当您获得查询结果时,订单范围将如下所示:

1-2

10-12

13-15

3-5

6-9

当您有一个查询和几个订单范围组时,这很容易在Excel中更正。然而,当您拉取许多查询时,一遍又一遍地纠正它是一件痛苦的事情。

拉取范围并正确排序的最好方法是什么?

下面是我要编写的查询示例:

代码语言:javascript
运行
复制
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...  ?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-24 06:47:28

我会保留一个范围表,例如(未写入索引)

代码语言:javascript
运行
复制
CREATE TABLE Ranges (RangeSet int, MinVal int, MaxVal int, Name varchar(50));

然后,例如

代码语言:javascript
运行
复制
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+');

你明白了吧。现在你做一些类似的事情(表名和字段名,免费虚构)

代码语言:javascript
运行
复制
SELECT
  CustomerID,
  count(OrderID) AS OrderCount
FROM Orders
WHERE <whatever, e.g order_date BETWEEN ... AND ...>
GROUP BY CustomerID
HAVING OrderCount>0

正如您通常所期望的那样,但将其包装在连接到Ranges表的超级查询中

代码语言:javascript
运行
复制
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,也许有时会创建一个新的。

免责声明:这是一个性能杀手

票数 3
EN

Stack Overflow用户

发布于 2011-12-25 00:15:47

如果我理解正确的话,您希望客户列表和订单范围从最小到最高排序。只需按计数排序(OrderID)就可以做到这一点

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

结果:

代码语言:javascript
运行
复制
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+
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8621147

复制
相关文章

相似问题

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