从两个表中 SELECT COUNT 不起作用

时间:2021-03-06 21:39:01

标签: sql count left-join

我有两个表 - 第一个表是“项目”:

<头>
p_id p_name
1 测试1
2 测试2
3 测试2
4 test3

p_name 不是唯一的

第二个表是“员工”:

<头>
e_id 一月 二月 三月 四月 可能
1 2 2 3 3 4
2 1 1 3 3 2
3 1 3 2 3 3
4 4 3 2 3 4

我想根据姓名计算员工中有多少个 p_name

我做什么:

select 
    p.id, p.name, 
    count(e1.jan) as e1, 
    count(e2.feb) as e2, 
    count(e3.mar) as e3  
from 
    projects p 
left join 
    employee e1 on (e1.jan = p.id) 
left join 
    employee e2 on (e2.feb = p.id) 
left join 
    employee e3 on (e3.mar = p.id) 
where 
    p.name = 'test2' 
group by 
    p.name;

但它不起作用。它不会返回预期的数字。

4 个答案:

答案 0 :(得分:2)

如果您能提供您希望看到的示例数据集,您会更清楚地了解您的目标。

但是,您可以尝试使用每个月的 apply() 进行以下操作

select p.id,p.[name], e1.qty, e2.qty, e3.qty, e4.qty, e5.qty
from 
projects p 
outer apply ( select count(*) qty from employee e where e.jan = p.id )e1
outer apply ( select count(*) qty from employee e where e.feb = p.id )e2
outer apply ( select count(*) qty from employee e where e.mar = p.id )e3
outer apply ( select count(*) qty from employee e where e.apr = p.id )e4
outer apply ( select count(*) qty from employee e where e.may = p.id )e5
where p.name = 'test2' 

答案 1 :(得分:1)

我完全同意@sTTu 的评论——所选择的设计不可扩展,一旦“新年”开始就会遇到问题。

纯粹出于好奇,我还是尝试提出以下解决方案:

(SQL-Server - 但也应该在 MySql 中工作)

DateTime.date

这是一个工作片段:https://rextester.com/TBWZA82894

结果:

<头>
姓名 一月 二月 三月
测试1 2 1 0
测试2 1 3 4
test3 1 0 0

或者,以更简单的方式,您可以这样做:

SELECT name, SUM(jan) Jan, SUM(feb) feb, SUM(mar) mar FROM (
  SELECT id, name, 
    (SELECT count(*) FROM employee WHERE jan=id) jan,
    (SELECT count(*) FROM employee WHERE feb=id) feb,
    (SELECT count(*) FROM employee WHERE mar=id) mar
  from projects ) tbl
group by name;

在此处查看演示:https://rextester.com/DEUUE59264

答案 2 :(得分:0)

select count(jan) from employee where jan in (
select p_id from projects where p_name = 'test1') 

你可以这样做,单独获取每一列的输出

答案 3 :(得分:0)

很明显为什么它不起作用。仅以项目 3 和二月和三月为例。您从一行开始,即项目。然后你加入了项目 3 的二月员工,其中有两个,所以现在你有两行。然后你对三月做同样的事情,同样有两行,但是因为在加入二月之后你有两行,你现在有 2*2 行,也就是四行。您需要在加入之前聚合,而不是加入之后。

我会使用外部应用方法。但更容易理解的选项可能是先聚合然后加入。

select 
    p.id, p.name, 
    e1.jan as e1, 
    e2.feb as e2, 
    e3.mar as e3  
from 
    projects p 
left join 
    (SELECT jan AS pid, COUNT(*) AS jan FROM employee) e1 on (e1.pid = p.id) 
left join 
    (SELECT feb AS pid, COUNT(*) AS feb FROM employee) e2 on (e2.pid = p.id)
left join 
    (SELECT mar AS pid, COUNT(*) AS mar FROM employee) e3 on (e3.pid = p.id)
left join 
    (SELECT apr AS pid, COUNT(*) AS apr FROM employee) e4 on (e4.pid = p.id)
where 
    p.name = 'test2'