【问题标题】:getting multiple counts in SQL在 SQL 中获取多个计数
【发布时间】:2020-11-24 22:56:19
【问题描述】:

我希望我的 sql 查询返回所有活动和过去案例的计数。我试过这样的查询,

SELECT 
    sum(case when need_By > sysdate and status not in (30,40,50) then 1 else 0 end) AS active,
    sum(case when need_by < sysdate and status not in (30,40,50) then 1 else 0 end) AS past
FROM discrepancy
GROUP BY id;

这给了我如下输出:

ACTIVE PAST
0      1
1      0
0      0
0      1
0      1

我期待的是,

ACTIVE PAST
  1      3

我应该如何更改查询以获取活动记录和过去记录的计数。此外,此查询将在休眠状态下执行,因此要确保 createNativeQuery 有效。

【问题讨论】:

    标签: java sql oracle hibernate


    【解决方案1】:

    删除GROUP BY:

    SELECT sum(case when need_By > sysdate and status not in (30,40,50) then 1 else 0 end) AS active,
           sum(case when need_by < sysdate and status not in (30,40,50) then 1 else 0 end) AS past
    FROM discrepancy;
    

    MySQL 还具有方便的速记符号,因此您可以直接计算布尔表达式:

    SELECT SUM(need_By > sysdate and status not in (30,40,50)) AS active,
           SUM(need_by < sysdate and status not in (30,40,50)) AS past
    FROM discrepancy;
    

    最后,您可以将NOT IN 移动到可以提高性能的WHERE 子句:

    SELECT SUM(need_By > sysdate) AS active,
           SUM(need_by < sysdate) AS past
    FROM discrepancy
    WHERE status NOT IN (30, 40, 50);
    

    编辑:

    在 Oracle 中,最后一个是:

    SELECT SUM(CASE WHEN need_By > sysdate THEN 1 ELSE 0 END) AS active,
           SUM(CASE WHEN need_by < sysdate THEN 1 ELSE 0 END) AS past
    FROM discrepancy
    WHERE status NOT IN (30, 40, 50);
    

    【讨论】:

    • 谢谢。第一个作品。如果我尝试执行第 2 和第 3 版本,我得到 ORA-00907:缺少右括号 00907。00000 -“缺少右括号” *原因:*操作:
    • @JNPW 。 . .你应该正确地标记你的问题。你有 MySQL 作为标签,它不会产生 ORA 错误。
    • 我没看到。MySQl 是个错误,我猜出来了。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多