SQL汇总 - 防止多次汇总记录

时间:2014-01-27 22:31:43

标签: sql oracle11g

首先,我想不出更好的问题标题。为此道歉。

所以,我正在编写一个查询,这是(我认为)它将返回而不聚合函数和分组。我使用它作为示例,实际查询包含更多字段:

SUBJ   CLASSROOM   CLASSROOM_CAPACITY
A      1           25
B      2           50
C      3           60
A      2           50
A      1           25 <--Not actually duplicate

现在你会说有重复的记录。但实际上它们并没有重复,因为有一些额外的字段(这里没有显示),这些字段对于那些看似重复的记录会有不同的值。

我想要的是什么:

SUBJ  CLASSROOM  CLASSROOM_CAPACITY
A     1          25
      2          50
      TOTAL      75
B     2          50
      TOTAL      50
C     3          60
      TOTAL      60
//EDIT - Apparently following line is causing too much confusion. Ignore it. How can I get rest of the table correctly?
TOTAL            135 //It seems its quite difficult to get 135 here. Its ok if this total is messed up

我在尝试什么:

SELECT
SOME_FIELDS,
SUBJ,
CLASSROOM,
SUM(CLASSROOM_CAPACITY)
FROM
MYTABLE
WHERE .....
GROUP BY SOME_FIELDS, ROLLUP(SUBJ,CLASSROOM)

问题:
由于那些“看似重复”的记录,课堂容量正在被多次总结。我该如何预防呢?我这样做是错误的吗?
实际的查询要复杂得多,但我想如果我能做到这一点,我可以将它应用于更大的查询。

PS:我知道如何使用ROLLUP使用GROUPING获取文字“总计”而不是空白条目,以便跳过该部分。

1 个答案:

答案 0 :(得分:1)

您引入的基数稍微偏离,当您对ROLLUP开始工作时进行排序。你的意思是:

SUBJ  CLASSROOM  CLASSROOM_CAPACITY
A     1          25

等于:

SUBJ  CLASSROOM  CLASSROOM_CAPACITY
A     1          25

SOME_FIELDS每行可能有所不同。当您汇总到上面的列时,您期望SOME_FIELDS发生什么?

如果出于此查询的目的可以忽略这些,最好的办法是首先找到DISTINCT条记录(即包含subj,classroom和classroom_capacity的唯一元组的记录),然后对此进行ROLLUP数据集。以下查询实现了这一点:

WITH distinct_subj_classrm_capacity AS (
  SELECT DISTINCT
    subj
  , classroom
  , classroom_capacity
  FROM mytable
)
SELECT
  subj
, classroom
, SUM(classroom_capacity)
FROM distinct_subj_classrm_capacity
GROUP BY ROLLUP(subj, classroom)

如果您对ROLLUP提供的中断报告结果不感兴趣而您只想要原始总数,那么您可以使用SUM的分析版本(有关Oracle分析函数的详细信息,请参阅此处:{{3} })

WITH distinct_subj_classrm_capacity AS (
  SELECT DISTINCT
    subj
  , classroom
  , classroom_capacity
  FROM mytable
)
SELECT DISTINCT
  subj
, SUM(classroom_capacity) OVER (PARTITION BY subj) classroom_capacity_per_subj
FROM distinct_subj_classrm_capacity

这样可以得到以下格式的结果:

SUBJ  CLASSROOM_CAPACITY_PER_SUBJ
A     75
B     50
C     60