通过使用分析函数在Oracle中对查询进行分组来计数

时间:2012-02-10 06:07:19

标签: sql database oracle group-by

我有一张桌子:

select personID, categoryCode from entries;

6300936427  083
6314642671  084
6314742066  081
6346724201  083
...

我可以通过以下方式计算每组人数:

select categoryCode, count(e.ID)
from entries e
group by e.categoryCode
order by e.categoryCode;

060 56
062 15
081 377
082 374

我想做同样的计算,但对于一些选择的类别,我想将它们计算在一起。例如,我想如果categoryCode IN('081','082')我想计算它们的结果。我的结果集应该计算为:

select ...

060 56
062 15
080 751 --(377 + 374) counts, that correspond to 081 and 082 categoryGroup

如何使用Oracle分析功能对此进行归档? (Oracle版本10)

2 个答案:

答案 0 :(得分:3)

我认为您可以通过扩展现有查询来实现您想要的目标。在我看来,你将categoryCode'081'和'082'映射到'080'的combinedCategoryCode,这是其他两个计数的总和。因此,您可以使用CASE语句执行映射,如下所示。您必须将所需的所有类别代码映射到单独的combineCategoryCodes。 ELSE子句处理您未映射的任何categoryCodes

SELECT CASE t.categoryCode
           WHEN '083' THEN '080'
           WHEN '084' THEN '080'
           ELSE t.categoryCode
       END AS combinedCategoryCode,
       SUM(t.[count]) AS combinedCount
FROM
    (
    -- This is your original query
    select categoryCode, count(e.ID) as [count]
    from entries e
    group by e.categoryCode
    ) t
GROUP BY CASE t.categoryCode
             WHEN '083' THEN '080'
             WHEN '084' THEN '080'
             ELSE t.categoryCode
         END
ORDER BY 1;

答案 1 :(得分:1)

史蒂文的查询可以改写:

SELECT 
       CASE  
           WHEN t.categoryCode in ('083', '084') THEN '080' 
           ELSE t.categoryCode 
       END AS combinedCategoryCode, 
       count(e.id) AS combinedCount 
FROM 
   entries t 
GROUP BY  
       CASE  
           WHEN t.categoryCode in ('083', '084') THEN '080' 
           ELSE t.categoryCode 
       END 
ORDER BY 1; 

但是:你可以创建一个配置表,config_categ

categoryCode  categ_result
060           060 
062           062
081           080
082           080

,查询将是:

SELECT 
   c.categ_result, 
   count(e.id) AS combinedCount 
FROM 
   entries t 
   join config_categ c on (t.categoryCode = c.categoryCode) 
GROUP BY  
   c.categ_result    
ORDER BY 1; 

PS:您不需要分析功能。这是一个简单的group by