基于sql中另一列的列中的唯一计数

时间:2019-04-24 21:17:01

标签: sql

我有一个雇员表,其中有两列:emp_id和month_of_project。我想找出特定月份参与项目的员工人数。这意味着如果同一个人参与了3个月,我们只会在第一个月中将该人计算在内。我在下面提到了样品

emp_id       month_of_project
101           Jan
102           Jan
103           Jan
101           Feb
104           Mar
102           Mar
105           Apr
103           Apr

结果应该是

month    count
Jan     3
Feb     0
Mar     1
Apr     1  

有什么方法可以在sql中实现吗?

4 个答案:

答案 0 :(得分:0)

我认为您只应使用GROUP BY子句

let executeScope = (function() {

  function init() {
    // do some init work here..
  }

  function execute(input) {
    let output = input * 2;
    return output;
  }

  function test() {
    console.log('test');
  }

  return {
    init: init,
    execute: execute,
    test: test
  };
})();

executeScope.init();
console.log(executeScope.execute(2));
executeScope.test();

答案 1 :(得分:0)

您可以使用NOT EXISTS仅获取上个月没有记录的记录。太糟糕了,您选择了月份的文本表示形式,而不是数字形式。因此,您首先必须将其转换为数字。您可以在此处使用CASE表达式。

SELECT t1.month_of_project,
       count(*)
       FROM elbat t1
       WHERE NOT EXISTS (SELECT *
                                FROM elbat t2
                                WHERE CASE t2.month_of_project
                                        WHEN 'Jan' THEN
                                          1
                                        ...
                                        WHEN 'Dec' THEN
                                          12
                                      END
                                      <
                                      CASE t1.month_of_project
                                        WHEN 'Jan' THEN
                                          1
                                        ...
                                        WHEN 'Dec' THEN
                                          12
                                      END
                                      AND t2.emp_id = t1.emp_id)
       GROUP BY t1.month_of_project;

答案 2 :(得分:0)

sql用于oracle。并且请不要在您的实际系统中存储这样的月份。使用日期字段。如果您的用例仅是月份,那么年份可以是任意的,例如2000,日期可以是01,但是要进行排序等。总有真实的日期总是总是正确的想法。

首先使用只是模拟数据。 mons部分中的第二个是获取可能的月份列表,因为您想要2月为0。如果您在外面有该表,则不需要。

然后,基本上内部查询会找到员工的第一个月作为要使用的月份,外部查询则有所不同

* {
  margin: 0;
  padding: 0;
}

答案 3 :(得分:0)

SQL Sever COUNT DISTINCT可以完全满足您的要求。但是,对正确的列进行分组很重要。

WITH TEMP AS
(
SELECT 1 AS EMP, 1 AS MONTH_D
UNION ALL
SELECT 2 AS EMP, 1 AS MONTH_D
UNION ALL
SELECT 2 AS EMP, 1 AS MONTH_D
UNION ALL
SELECT 3 AS EMP, 1 AS MONTH_D
UNION ALL
SELECT 1 AS EMP, 2 AS MONTH_D

)

SELECT MONTH_D, COUNT(DISTINCT EMP) FROM TEMP
GROUP BY MONTH_D
相关问题