簡體   English   中英

在案例表達的條件部分內使用計數功能

[英]Use Count function inside conditional part of Case Expression

我在Oracle數據庫中有兩個帶有以下示例記錄的表

1.員工

inst_name   name    sid
ABC         John    1
PQR         Sam     2
ABC         Tom     3
ABC         Amit    4
PQR         Jack    5

2.人員賬戶

sid     account_no
1       4587
1       4588
2       4589
3       4581
3       4582
5       4583
5       4585
4       4586

我想要的結果像

inst_name   account_type    total
PQR         SINGLE          1
ABC         SINGLE          1
PQR         DOUBLE          1
ABC         DOUBLE          2

這可以通過外部查詢來實現,但是我想編寫一個沒有外部查詢的查詢。 想要在一個查詢中完成。

SELECT
    A .inst_name,
    (
        CASE COUNT (b.ac_no)
        WHEN 1 THEN
            'Single'
        WHEN 2 THEN
            'Double'
        END
    ) account_type,
    COUNT (A . NAME)
FROM
    staffs A,
    staffaccounts b
WHERE
    A . s_id = b.s_id
GROUP BY
    A .inst_name

上面的查詢給出錯誤ORA-00907: missing right parenthesis 可以在單個查詢中完成還是外部查詢是唯一的出路。

Oracle Version is 10g 

可能像這樣會起作用。

SELECT
    A.inst_name,
        CASE COUNT (b.account_no)
        WHEN 1 THEN
            'Single'
        WHEN 2 THEN
            'Double'
        END account_type,
    COUNT (A.name)
FROM
    staffs A JOIN
    staffaccounts b
ON
    A.SID = b.sid
GROUP BY
    A.inst_name , a.sid
    ORDER BY 3;  

您應該學習如何正確使用JOIN語法。 我更喜歡CASE的顯式比較語法。

這可能是您想要的:

SELECT s.inst_name,
       (CASE WHEN COUNT(sa.ac_no) = 1 THEN 'Single'
             WHEN COUNT(sa.ac_no) = 2 THEN 'Double'
        END) as account_type,
       COUNT(*)
FROM staffs s JOIN
     staffaccounts sa
     ON s.SID = sa.sid
GROUP BY s.inst_name;

編輯:

現在我明白了你想要什么:

SELECT s.inst_name,
       (CASE WHEN cnt = 1 THEN 'Single'
             WHEN cnt = 2 THEN 'Double'
        END) as account_type,
       COUNT(*)
FROM (SELECT s.*, COUNT(*) as cnt
      FROM staffs s JOIN
           staffaccounts sa
           ON s.SID = sa.sid
      GROUP BY s.id
     ) s
GROUP BY s.inst_name,
         (CASE WHEN cnt = 1 THEN 'Single'
               WHEN cnt = 2 THEN 'Double'
          END);

您正在按inst_name分組,但這並不是您真正想要的,因為您不希望每個inst_name而是每個inst_nameaccount_type都存在結果行。

select
  s.inst_name,
  sa.account_type,
  count(*) as total
from staffs s
join
(
  select 
    sid, 
    case when count(*) = 1 then 'SINGLE' else 'DOUBLE' end as account_type
  from staffaccounts
  group by sid
  having count(*) <= 2
) sa on sa.sid = s.sid
group by sa.account_type, s.inst_name
order by sa.account_type, s.inst_name;

只能通過使用subquery但是以一種簡單的方式(more easier and readable)可以滿足您的要求

SELECT inst_name, account_type, count(total) as total
FROM (
    SELECT
        a.inst_name, 
        CASE 
            WHEN COUNT (b.account_no) = 1 THEN 'Single'
            WHEN COUNT (b.account_no) = 2 THEN 'Double'
        END AS account_type,
        COUNT (a.name) AS total
    FROM staffs a
    INNER JOIN staffaccounts b ON A . SID = b.sid
    GROUP BY a.inst_name, a.sid) t GROUP BY inst_name, account_type

輸出

inst_name   account_type    total
ABC         Double          2
PQR         Double          1
ABC         Single          1
PQR         Single          1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM