我有一个雇员表,其中有两列: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中实现吗?
答案 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