【问题标题】:How to use rollup in SQL in select groupby如何在 select groupby 中使用 SQL 中的汇总
【发布时间】:2013-10-09 17:37:17
【问题描述】:

我尝试按来源分组,然后按日期分组,然后按状态分组,并为每个分组获取计数。这在我的代码中有效:

SELECT sourceCode as "Source", to_char(myTimestamp, 'YYYY-MM-DD') as "Date", statusCode as "Status", count(*) as "Count"
FROM archive_table
WHERE myTimestamp BETWEEN TO_TIMESTAMP('2013-09-30','yyyy-mm-dd') AND TO_TIMESTAMP('2013-10-05','yyyy-mm-dd')
GROUP BY sourceCode, to_char(myTimestamp, 'YYYY-MM-DD'), statusCode
ORDER BY 1, 2, 3

这是输出:

Source  Date    Status  Count
Source1 9/30/2013   C   10
Source1 10/1/2013   C   8
Source1 10/2/2013   C   24
Source1 10/2/2013   O   4
Source1 10/3/2013   C   19
Source1 10/3/2013   O   6
Source1 10/4/2013   C   5
Source1 10/4/2013   O   8
Source2 10/4/2013   C   22
Source2 10/4/2013   O   7
Source3 10/1/2013   C   2
Source4 9/30/2013   C   15
Source4 9/30/2013   O   15
Source4 10/1/2013   C   24
Source4 10/1/2013   O   12
Source4 10/2/2013   C   18
Source4 10/2/2013   O   8
Source4 10/3/2013   C   23
Source4 10/3/2013   O   13

但是,我想获得每个来源、每个日期、每个状态的 SUM 或总数。我在 GROUP BY 的末尾尝试了 WITH ROLLUP,但收到了 Oracle 错误。

我希望输出能给出上述结果和一些额外的计数,如下所示:

Source  Date    Status  Count
Source1         84     --Shows counts for each source
Source2         29
Source3         2
Source4         128
Source1     O   18     --Show counts each source by status
Source2     C   7
Source3     O   2
Source3     C   0
Source4     O   48
Source4     C   80
all src 9/30/2013   O   15     --Show counts each source by date & status
all src 9/30/2013   C   25
all src 10/1/2013   O   12
all src 10/1/2013   C   20
all src 10/2/2013   O   15
all src 10/2/2013   C   10
all src 10/3/2013   O   0
all src 10/3/2013   C   25
all src 10/4/2013   O   15
all src 10/4/2013   C   13

也许这在 ROLLUP 中是不可能的

我不确定这是否是我发现它返回的结果我无法阅读的适当解决方案:

SELECT sourceCode as "Source", to_char(myTimestamp, 'YYYY-MM-DD') as "Date", statusCode as "Status", count(*) as "Count"
FROM archive_table
WHERE myTimestamp BETWEEN TO_TIMESTAMP('2013-09-30','yyyy-mm-dd') AND TO_TIMESTAMP('2013-10-05','yyyy-mm-dd')
GROUP BY 
ROLLUP (sourceCode, to_char(myTimestamp, 'YYYY-MM-DD'), statusCode)
ORDER BY 1, 2, 3

这些是输出结果:

Source  Date    Status  Count
Source1 10/1/2013       8
Source1 10/2/2013   C   24
Source1 10/2/2013   O   4
Source1 10/2/2013       28
Source1 10/3/2013   C   19
Source1 10/3/2013   O   6
Source1 10/3/2013       25
Source1 10/4/2013   C   5
Source1 10/4/2013   O   8
Source1 10/4/2013       13
Source1         84
Source2 10/4/2013   C   22
Source2 10/4/2013   O   7
Source2 10/4/2013       29
Source2         29
Source3 10/1/2013   C   2
Source3 10/1/2013       2
Source3         2
Source4 9/30/2013   C   15
Source4 9/30/2013   O   15
Source4 9/30/2013       30
Source4 10/1/2013   C   24
Source4 10/1/2013   O   12
Source4 10/1/2013       36
Source4 10/2/2013   C   18
Source4 10/2/2013   O   8
Source4 10/2/2013       26
Source4 10/3/2013   C   24
Source4 10/3/2013   O   12
Source4 10/3/2013       36
Source4 10/4/2013   C   30
Source4 10/4/2013   O   11
Source4 10/4/2013       41
Source4         169
            284

【问题讨论】:

  • 你试过GROUP BY cube(sourceCode, to_char(myTimestamp, 'YYYY-MM-DD'), statusCode)吗?
  • @EgorSkriptunoff 是的,我做了汇总,我粘贴了我的结果,但我不明白如何解释它们以查看它是否是我需要的,因为它只是给出了一堆带有数字的“空白”列结束
  • 使用GROUPING(column_name)函数。
  • @EgorSkriptunoff 实际上我需要纠正自己,我以为你说的是​​“GROUP BY”我没有看到“GROUP BY 立方体”。我会试一试,看看我能得到什么结果。

标签: sql oracle group-by rollup


【解决方案1】:

试试这个:http://sqlfiddle.com/#!4/98d9e/6/0.
我使用总和而不是计数,因为我为您的第一个输出建模。我不想输入原始数据。

Egor 的评论是正确的,使用 cube 函数获取 Source、Date 和 Status 之间的所有各种组合。多维数据集的行数将为 2 ^ n,其中 n = 多维数据集语句中的列数。空列表示小计的行。小提琴中的 decode 语句会处理这个问题,并为小计输入“all ...”。如果您需要使用外部查询查找特定小计,这也很有帮助。

Oracle 文档中有一些非常好的多维数据集示例。 http://docs.oracle.com/cd/E11882_01/server.112/e25554/aggreg.htm#DWHSG8614

【讨论】:

  • 嗨 - 你能解释一下解码中的 1 吗?我在网上查看了 Decode 的示例,它说它应该是您要搜索的值: DECODE( expression , search , result [, search , result]... [, default] ) techonthenet.com/oracle/functions/decode.php
  • decode 有点像花哨的 nvl 检查。当你说你给它一个表达式,一个搜索,如果它找到搜索怎么办,如果它没有找到它,你是对的。分组子句为聚合行返回 1,为详细行返回 0。解码是说如果聚合行然后使用“所有...”的结果,而不是使用那里的空值,否则使用那里的内容(Source1 或 Source2 或 C 或 O 等)。
  • +1 and accept =) 太好了 - 谢谢它运行良好,我只需要修改一个子查询,以便我可以让它返回更多详细信息(例如 9/30/13没有 Source1 Status='O' 所以它不会显示为 0,但那是无关的,我想只需要自己工作
  • 您也许可以使用 having 子句来限制它们。有 count(*) > 0 或其他。如果不使用 SQLFiddle 或实际实例进行检查,我并不肯定。此外,立方体实际上是汇总的助手,因此您可以将多个汇总与您想要的组合一起使用。 cube(source, date, status) 实际上是 8 个汇总命令。 rollup(source), rollup(source, date), rollup(source, status)等
猜你喜欢
  • 2014-08-15
  • 2017-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多