2014-01-27 39 views
0

首先,我想不出更好的问题标题。为此道歉。SQL汇总 - 多次防止总结记录

所以,我正在写一个查询,这里是一些(我认为)它会返回没有聚合函数和group by。我用这作为一个例子,实际的查询中含得更多领域:

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:我知道如何使用GROUPING获得文本“Total”而不是空格输入ROLLUP,因此您可以跳过该部分。

+1

你如何获得总计135?你总结什么样的价值观,你排除了什么样的价值观?你怎么知道要包含哪些值? –

+0

我不明白。我想要得到它。所列课程的所有教室的课堂容量总和为25 + 50 + 60。但这并不重要。我想至少其他总数是正确的 – tumchaaditya

+0

我知道这是一个坏榜样。但是这是我能想到的最好的.. – tumchaaditya

回答

1

您介绍的基数有点偏离,当您对ROLLUP开始工作时进行排序。你说:

SUBJ CLASSROOM CLASSROOM_CAPACITY 
A  1   25 

等于:

SUBJ CLASSROOM CLASSROOM_CAPACITY 
A  1   25 

SOME_FIELDS可以每行而有所不同。当你汇总到上面的列时,你期望发生在SOME_FIELDS

如果这些可以忽略为这个查询的目的,你最好的选择是首先找到DISTINCT记录(即包含一个独特的子元素,教室和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分析功能:http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions004.htm

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 
+0

谢谢。 'SOME_FIELDS'加在汇总中,因为它们被包装在'SUM()'中。我会尝试不同的。 – tumchaaditya