2012-04-19 2 views
1
CREATE TABLE TEMP25 
(
    STATUS VARCHAR2(200 BYTE) 
); 

Insert into TEMP25 
    (STATUS) 
Values 
    ('PENDING'); 
Insert into TEMP25 
    (STATUS) 
Values 
    ('ERROR'); 
Insert into TEMP25 
    (STATUS) 
Values 
    ('ERROR'); 
Insert into TEMP25 
    (STATUS) 
Values 
    ('ERROR'); 
Insert into TEMP25 
    (STATUS) 
Values 
    ('NOT_REQUIRED'); 
Insert into TEMP25 
    (STATUS) 
Values 
    ('NOT_REQUIRED'); 
Insert into TEMP25 
    (STATUS) 
Values 
    ('PENDING'); 
Insert into TEMP25 
    (STATUS) 
Values 
    ('PENDING'); 
Insert into TEMP25 
    (STATUS) 
Values 
    ('ERROR'); 
Insert into TEMP25 
    (STATUS) 
Values 
    ('NOT_REQUIRED'); 
Insert into TEMP25 
    (STATUS) 
Values 
    ('ERROR'); 
Insert into TEMP25 
    (STATUS) 
Values 
    ('INVALID'); 
Insert into TEMP25 
    (STATUS) 
Values 
    ('INVALID'); 
Insert into TEMP25 
    (STATUS) 
Values 
    ('PENDING'); 

Я хочу написать запрос таким образом, что я получаю рассчитывать каквыборки результата запроса

TOTAL_RECORDS TOTAL_PENDING TOTAL_NOT_REQUIRED TOTAL_PENDING 
----------------------------------------------------------------- 
    14    4    3     5 
----------------------------------------------------------------- 

Я хочу, чтобы запись в последовательности и в одном запросе, я ahve пытался с with table пунктом он работает. ..is там любое другое решение ... и ДНТ хочу недействительные записи

ответ

5

Вы можете использовать SUM/CASE или (SUM/DECODE, если вы предпочитаете)

Select 
    COUNT(*) TOTAL_RECORDS , 
    SUM(case when status = 'PENDING' then 1 else 0 END) TOTAL_PENDING, 
    SUM(case when status = 'NOT_REQUIRED' then 1 else 0 END) TOTAL_NOT_REQUIRED, 
    SUM(case when status = 'ERROR' then 1 else 0 END) TOTAL_ERROR 


FROM temp25 

See it working here

Вы также можете использовать стержень но получить COUNT (*) немного некрасиво

WITH 
COUNTS AS(
select * 
from (
    select status 
    from TEMP25 t 
) 
pivot 
(
    count(status) 
    for status in ('PENDING' AS TOTAL_PENDING, 
        'NOT_REQUIRED' AS TOTAL_NOT_REQUIRED, 
        'ERROR' AS TOTAL_ERROR) 
)) 


SELECT COUNT(*) total_records, 
     total_pending, 
     total_not_required, 
     total_error 
FROM temp25, 
     counts 
GROUP BY total_pending, 
      total_not_required, 
      total_error 

Pivot version

+1

+1 для запроса ........ –

4

Вы можете легко сделать использование случае, если заявление и получить этот результат ... есть смотреть на него также ...

Select COUNT(*) TOTAL_RECORDS ,  
SUM(case when status = 'ERROR' then 1 else 0 END) TOTAL_ERROR 
SUM(case when status = 'NOT_REQUIRED' then 1 else 0 END) TOTAL_NOT_REQUIRED,  
SUM(case when status = 'PENDING' then 1 else 0 END) TOTAL_PENDING, 
FROM temp25 
0

В Oracle вы можете

SELECT 
    (SELECT COUNT(*) FROM TEMP25) total, 
    (SELECT COUNT(*) FROM TEMP25 WHERE STATUS='PENDING') pending, 
[...] 
FROM dual ; 

Все базы данных имеют нулевую таблицу, которую вы можете использовать из такого рода вещей.

+1

предыдущие ответы имеют преимущество одиночного сканирования таблицы суса. –

Смежные вопросы