2015-04-06 5 views
1

Я следующий запрос:Count с Case Select в Oracle

SELECT t.range, 
     Count(*) 
FROM (
    SELECT CASE 
      WHEN creditscore BETWEEN 300 
        AND 499 
       THEN '[300, 499]' 
      WHEN creditscore BETWEEN 500 
        AND 699 
       THEN '[500, 699]' 
      WHEN creditscore BETWEEN 700 
        AND 850 
       THEN '[700, 850]' 
      END AS range 
    FROM customer 
    ) T 
GROUP BY t.range; 

Что дает мне следующее:

CS range  COUNT(*) 
---------- ---------- 
[700, 850]   7 
[500, 699]   13 

Я хочу следующий вывод:

CS range  COUNT(*) 
---------- ---------- 
[300, 499]   0 
[500, 699]   13 
[700, 850]   7 
Может

никому выручи меня?

UPDATE

Я выполнил коду, Джастин условия. Это дает мне следующее:

DESCRIPTIO COUNT(*) 
---------- ---------- 
[300, 499]   1 
[700, 850]   7 
[500, 699]   13 

SQL> SELECT COUNT(*) FROM customer where creditscore BETWEEN 300 AND 499; 

COUNT(*) 
---------- 
     0 
+0

Создать временную таблицу с диапазонами, то 'ЛЕВЫЙ JOIN' его к результатам, заменяя нуль с 0. –

ответ

1

Одним из вариантов было бы сделать что-то вроде

WITH ranges AS (
    SELECT '[300, 499]' description, 300 min_val, 499 max_val FROM dual 
    UNION ALL 
    SELECT '[500, 699]' description, 500 min_val, 699 max_val FROM dual 
    UNION ALL 
    SELECT '[700, 850]' description, 700 min_val, 850 max_val FROM dual 
) 
SELECT r.description, count(creditscore) 
    FROM ranges r 
     LEFT OUTER JOIN customer c 
     ON (c.creditscore BETWEEN r.min_val AND r.max_val) 
GROUP BY r.description 

Обычно, вы хотели бы создать постоянную таблицу с диапазонами в случае, если кто-то хочет, чтобы добавить или изменить их в будущем. Но вы можете жестко закодировать диапазоны в своем запросе, как я здесь.

+0

Ваш запрос, кажется получением дополнительный выход для записей между 300 и 499. Я обновил вопрос, пожалуйста, посмотрите. – AngryPanda

+0

@AngryPanda - Извините, у меня был 'count (*)', а не 'count (creditcore)'. –

0

В этом случае вы можете использовать unpivot. Ваш ответа-

Select * From 
(
Select Sum(Col1) "[300, 499]", Sum(Col2) "[500, 699]", Sum(Col3) "[700, 850]" 
From (
    Select Case 
      When Creditscore Between 300 
        And 499 
       Then 1 Else 0 End As Col1, 
      Case When Creditscore Between 500 
        And 699 
       Then 1 Else 0 End Col2, 
      Case When Creditscore Between 700 
        And 850 
       Then 1 Else 0 End Col3 
    From Customer 
    ) 
) 
Unpivot 
(
    "Count" 
    For 
    "Description" In ("[300, 499]", "[500, 699]", "[700, 850]") 
); 

Результат -

Description Count 
[300, 499] 0 
[500, 699] 4 
[700, 850] 3 
Смежные вопросы