2016-05-26 5 views
0

У меня есть таблица Oracle, которая содержит данные, аналогичные следующий основной пример:Oracle SQL Query для штабелей Парето Диаграммы

+--------+----------+ 
| SERIES | CATEGORY | 
+--------+----------+ 
| green | apple | 
| green | pear  | 
| green | pear  | 
| yellow | apple | 
| yellow | apple | 
| yellow | pear  | 
| yellow | pear  | 
| yellow | pear  | 
| yellow | banana | 
| yellow | banana | 
| yellow | banana | 
| red | apple | 
+--------+----------+ 

Я хотел бы, чтобы сгенерировать Парето как графики этих данных, которые должны выглядеть как Stacked Диаграмма Парето,

enter image description here

чтобы создать этот график, я хотел бы выполнить запрос SQL и получить следующий вывод:

+----------+--------+-------+ 
| CATEGORY | SERIES | COUNT | 
+----------+--------+-------+ 
| pear  | green |  2 | 
| pear  | yellow |  3 | 
| apple | green |  1 | 
| apple | yellow |  2 | 
| apple | red |  1 | 
| banana | yellow |  3 | 
+----------+--------+-------+ 

Фактическая таблицы имеет миллионы записей, и в настоящее время занимает значительное количество времени для запроса базы данных в качестве текущей процедуры я использую не очень эффективно:

Порядка категорий по количеству записей в каждом категория:

SELECT CATEGORY, COUNT(CATEGORY) FROM FRUIT GROUP BY CATEGORY ORDER BY COUNT(CATEGORY); 

Тогда для каждой категории I список соответствующих серий в порядке серии:

SELECT SERIES, COUNT(SERIES) FROM FRUIT WHERE CATEGORY = [current category] GROUP BY SERIES ORDER BY SERIES; 

что бы наиболее эффективным способом Que ry в базе данных (желательно для одного оператора SQL), чтобы получить желаемый результат?

+0

насчет: 'SELECT, категория, тип, COUNT (*) FROM FRUIT GROUP по категориям SERIES ORDER BY COUNT (*)'? –

ответ

0

Некоторые более короткая версия:

select category, series, CntS 
from (
    select distinct count(category) over (partition by category) cntC, 
    count(series) over (partition by category, series) cntS, 
    category, series 
from fruit ) Tab 
order by CntC desc, cntS desc; 
0

Вы можете достичь желаемого результата путем группирования на обоих CATEGORY и SERIES:

SELECT 
    CATEGORY, SERIES, COUNT(*) 
FROM FRUIT 
GROUP BY CATEGORY, SERIES 
ORDER BY COUNT(*); 

UPDATE:

Чтобы заказать по общей CATEGORY первым, а затем зеленый, желтый, красный, просто как ожидаемый результат:

SELECT t1.* 
FROM (
    SELECT 
     CATEGORY, SERIES, COUNT(*) AS CNT 
    FROM FRUIT 
    GROUP BY CATEGORY, SERIES 
) t1 
INNER JOIN (
    SELECT 
     CATEGORY, COUNT(*) AS CNT 
    FROM FRUIT 
    GROUP BY CATEGORY 
) t2 
    ON t1.CATEGORY = t2.CATEGORY 
ORDER BY 
    t2.CNT DESC, 
    CASE t1.SERIES 
     WHEN 'green' THEN 1 
     WHEN 'yellow' THEN 2 
     WHEN 'red' THEN 3 
    END 
+0

Я пробовал, что тогда результат заказывается по COUNT (SERIES), а не по COUNT (CATEGORY). Мой вывод: \t \t \t \t \t \t \t \t \t банан | желтый \t | 3; \t груша \t \t | желтый \t | 3; \t груша \t \t | зеленый \t | 2; \t apple \t | желтый \t | 2; \t apple \t | зеленый \t | 1; \t apple \t | красный \t \t | 1 – Jaco

+0

Обновление работает. Большое спасибо :) – Jaco