Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用分析函数在Oracle中分组查询计数_Sql_Database_Oracle_Group By - Fatal编程技术网

Sql 使用分析函数在Oracle中分组查询计数

Sql 使用分析函数在Oracle中分组查询计数,sql,database,oracle,group-by,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

我有一张桌子:

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
我想做同样的计算,但对于一些选定的类别,我想将它们一起计算。例如,我希望如果categorycodein('081','082')我希望为它们计算结果。我的结果集应计算为:

select ...

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

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

我认为,只要扩展现有查询,就可以实现您想要的。在我看来,您正在将类别代码“081”和“082”映射到组合的类别代码“080”,这是其他两个计数的总和。因此,您可以使用CASE语句进行如下映射。您必须将所有想要的categoryCodes映射到单个组合categoryCodes。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;

我认为,只要扩展现有查询,就可以实现您想要的。在我看来,您正在将类别代码“081”和“082”映射到组合的类别代码“080”,这是其他两个计数的总和。因此,您可以使用CASE语句进行如下映射。您必须将所有想要的categoryCodes映射到单个组合categoryCodes。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;

Steven的查询可以重写:

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:这不需要解析函数。这是一个简单的
分组依据

Steven的查询可以重写:

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:这不需要解析函数。这是一个简单的
分组方式

谢谢,您的解决方案可行,但是有没有办法使用Oracle分析函数进行相同的计算?谢谢,您的解决方案可行,但是有没有办法使用Oracle分析函数进行相同的计算?