2010-09-21 40 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輕鬆完成此操作。 – 2010-09-21 13:52:53

回答

10

你可以在用戶ID組和總結不同的狀態代碼。

喜歡的東西:

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 

您也可以考慮簡單的分組對用戶名和狀態,雖然結果當然不同佈局的:

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

當我在第一個查詢中用「end」(Remove case)替換「end case」時,查詢會運行,否則它會執行「ORA-00907:缺少右括號」的過程。你能解釋一下嗎? – Vimvq1987 2010-09-21 14:46:24

+0

你只是不應該在oracle中使用'end case'。只用'end'。 – 2010-09-21 14:49:32

+0

@ Vimvq1987:顯然正確的語法是'case ... end',而不是'case ... end case'。我檢查了這個頁面的語法,但它顯然是錯誤的:http://www.oracle.com/technology/sample_code/tech/pl_sql/htdocs/x/Case/start.htm – Guffa 2010-09-21 16:56:00

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

只是爲了後續@ Vimvq1987和@Guffa評論:SQL的正確語法是case ... end,但對於PL/SQL它應該是case ... end case,所以你提供的鏈接上的信息是正確的。因此,在您的SQL查詢中(無論是在SQL-Plus中還是在PL/SQL中的DML中執行它),都應該使用case ... end,但在PL/SQL例程中需要case ... end case

相關問題