Подсчет путем группировки запросов в Oracle с использованием аналитических функций - PullRequest
0 голосов
/ 10 февраля 2012

У меня есть стол:

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 ]

3 голосов
/ 10 февраля 2012

Я думаю, что вы можете достичь того, чего хотите, просто расширив существующий запрос.Мне кажется, что вы сопоставляете categoryCode '081' и '082' для комбинированногоCategoryCode '080', и это сумма двух других подсчетов.Таким образом, вы можете использовать оператор CASE для отображения следующим образом.Вам нужно будет сопоставить все коды категорий, которые вы хотите, с отдельными комбинированными кодами категорий.Предложение ELSE относится ко всем категориям кодов, которые вы не отображаете

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 голос
/ 10 февраля 2012

Запрос Стивена можно переписать:

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.

...