在Case Expression

时间:2017-12-12 11:31:37

标签: sql oracle count aggregate-functions case-when

我有两个表,在oracle数据库中有以下示例记录

1。人员

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

2。 staffaccounts

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 

4 个答案:

答案 0 :(得分:0)

这可能会有用。

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;  

答案 1 :(得分:0)

您应该学习如何正确使用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);

答案 2 :(得分:0)

您按inst_name分组,但这不是您真正想要的,因为您不希望每inst_name个结果行,而是inst_name和{{1} }。

account_type

答案 3 :(得分:0)

我只使用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