2010-09-21 5 views
1

У меня есть таблица вроде этого:Как подсчитать каждое значение столбца в таблице?

UserID  Customer ID status   
1    1   1 
1    2   1 
1    3   1 
1    4   2 
1    5   1 
1    6   3 
1    7   2 
2    8   1 
2    9   2 
........ 

Я хочу подытожить эту таблицу, для этого:

UserID   count(status 1) count(status 2) count(status 3) 
    1    4    2      1 
    2    1    2      3 
    ......... 

Как я могу сделать это в PL/SQL?

Спасибо заранее

+0

Какая версия Oracle? Если вы используете 11, вы можете использовать PIVOT, чтобы сделать это легко. –

ответ

10

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

Что-то вроде:

select 
    UserId, 
    sum(case status when 1 then 1 else 0 end) as Status1, 
    sum(case status when 2 then 1 else 0 end) as Status2, 
    sum(case status when 3 then 1 else 0 end) as Status3 
from SomeTable 
group by UserId 
order by UserId 

Вы могли бы также рассмотреть просто группировку по UserId и статуса, хотя результат, конечно, по-разному выложенной:

select UserId, status, count(*) 
from SomeTable 
group by UserId, status 
order by UserId, status 
+0

, когда я заменю «конечный регистр» в первом запросе на «конец» («Удалить»), выполняется запрос, в противном случае процедуры «ORA-00907: отсутствуют правильные скобки». Вы можете это объяснить? – Vimvq1987

+0

вы просто не должны использовать 'end case' в oracle. используйте только «конец». –

+0

@ Vimvq1987: Очевидно, что правильный синтаксис «case ... end», а не «case ... end case». Я проверил эту страницу для синтаксиса, но это явно неправильно: http://www.oracle.com/technology/sample_code/tech/pl_sql/htdocs/x/Case/start.htm – Guffa

1
select userid, 
     count(decode(status, 1, 1, null)), 
     count(decode(status, 2, 1, null)), 
     count(decode(status, 3, 1, null)), 
    from table 
group by userid 
1
SELECT * 
    FROM (SELECT UserID, 
       status, 
       COUNT(status) 
      FROM <table> 
      GROUP BY UserID, 
        status 
     ) 
PIVOT(COUNT(status) FOR status IN (1,2,3)) 
0

Просто к follow up @ Vimvq1987 и @Guffa комментарии: правильный синтаксис для SQL is case ... end, но для PL/SQL это может быть case ... end case, поэтому информация по предоставленной вами ссылке права.

Следовательно, в ваших SQL-запросах (либо вы выполняете его в SQL-Plus, либо в DML в PL/SQL) вы должны использовать case ... end, но в подпрограммах PL/SQL требуется case ... end case.

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