首页 > 解决方案 > SQL:计算列 = 值且另一列与第一个条件为真的组中的值相同的行?

问题描述

我需要计算每个员工的行数,其中status = 9和 与中的date其他行相同。我还想要and ,每个员工的所有行的计数。employee_idstatus = 9employee_idcount_all

弄清楚如何获得count_same_date_status_9专栏是我卡住的地方。这些日期仅用于示例,因此我不想将它们明确地放入查询中。

我的桌子:

employee_id     status     date
1               9          10/19/2020
1               7          07/16/2001
1               9          10/19/2020
2               5          08/11/2011
2               9          12/25/2012
2               9          11/19/2013
3               5          06/05/2016
3               4          01/01/2021
4               9          02/15/2018
4               9          02/15/2018
4               9          02/15/2018

我想返回以下内容:

employee_id     count_same_date_status_9     count_all
1               2                            3
2               0                            3
3               0                            2
4               3                            3

标签: sqloracledatetimegroup-bycount

解决方案


您可以使用:

SELECT employee_id,
       MAX( CASE WHEN status = 9 AND cnt > 1 THEN cnt ELSE 0 END ) AS count_9,
       SUM( cnt ) AS count_all
FROM   (
  SELECT employee_id,
         status,
         dt,
         COUNT(*) AS cnt
  FROM   table_name
  GROUP BY employee_id, status, dt
)
GROUP BY employee_id
ORDER BY employee_id;

其中,对于您的示例数据:

CREATE TABLE table_name ( employee_id, status, dt ) AS
SELECT 1, 9, DATE '2020-10-19' FROM DUAL UNION ALL
SELECT 1, 7, DATE '2001-07-16' FROM DUAL UNION ALL
SELECT 1, 9, DATE '2020-10-19' FROM DUAL UNION ALL
SELECT 2, 5, DATE '2011-08-11' FROM DUAL UNION ALL
SELECT 2, 9, DATE '2012-12-25' FROM DUAL UNION ALL
SELECT 2, 9, DATE '2013-11-19' FROM DUAL UNION ALL
SELECT 3, 5, DATE '2016-06-05' FROM DUAL UNION ALL
SELECT 3, 4, DATE '2021-01-01' FROM DUAL UNION ALL
SELECT 4, 9, DATE '2018-02-15' FROM DUAL UNION ALL
SELECT 4, 9, DATE '2018-02-15' FROM DUAL UNION ALL
SELECT 4, 9, DATE '2018-02-15' FROM DUAL;

输出:

员工 ID | COUNT_9 | COUNT_ALL
----------: | ------: | --------:
          1 | 2 | 3
          2 | 0 | 3
          3 | 0 | 2
          4 | 3 | 3

db<>在这里摆弄


推荐阅读