SELECT 两个表中的 COUNT 不起作用
SELECT COUNT from two tables is not working
我有两个 table - 第一个 table 是“项目”:
p_id
p_name
1
test1
2
test2
3
test2
4
test3
p_name 不是唯一的
第二个table是“员工”:
e_id
jan
feb
mar
apr
may
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;
但是没用。它没有 return 预期的数字。
如果您能提供您希望看到的示例数据集,您会更清楚地了解您的目标。
但是,您可以尝试使用每个月的 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'
select count(jan) from employee where jan in (
select p_id from projects where p_name = 'test1')
您可以这样做并单独获取每一列的输出
很清楚为什么它不起作用。仅以项目 3 以及二月和三月为例。你从一行开始,项目。然后您加入了项目 3 的 2 月员工,其中有两个,所以现在您有两行。然后你对 march 做同样的事情,同样有两行,但是因为你在 Feb 加入后有两行你现在有 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'
我完全同意@sTTu 的评论 - 所选择的设计是不可扩展的,一旦“新年”开始,就会 运行 出现问题。
出于好奇,我试图想出一个解决方案,如下所示:
(SQL-服务器 - 但也应该在 MySql)
中工作
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/TBWZA82894
结果:
name
Jan
feb
mar
test1
2
1
0
test2
1
3
4
test3
1
0
0
或者,您可以更简单地这样做:
SELECT name,
COUNT(CASE WHEN jan=id THEN 1 END) jan,
COUNT(CASE WHEN feb=id THEN 1 END) feb,
COUNT(CASE WHEN mar=id THEN 1 END) mar
FROM employee
INNER JOIN projects ON id>0
GROUP BY name
在此处查看演示:https://rextester.com/DEUUE59264
我有两个 table - 第一个 table 是“项目”:
p_id | p_name |
---|---|
1 | test1 |
2 | test2 |
3 | test2 |
4 | test3 |
p_name 不是唯一的
第二个table是“员工”:
e_id | jan | feb | mar | apr | may |
---|---|---|---|---|---|
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;
但是没用。它没有 return 预期的数字。
如果您能提供您希望看到的示例数据集,您会更清楚地了解您的目标。
但是,您可以尝试使用每个月的 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'
select count(jan) from employee where jan in (
select p_id from projects where p_name = 'test1')
您可以这样做并单独获取每一列的输出
很清楚为什么它不起作用。仅以项目 3 以及二月和三月为例。你从一行开始,项目。然后您加入了项目 3 的 2 月员工,其中有两个,所以现在您有两行。然后你对 march 做同样的事情,同样有两行,但是因为你在 Feb 加入后有两行你现在有 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'
我完全同意@sTTu 的评论 - 所选择的设计是不可扩展的,一旦“新年”开始,就会 运行 出现问题。
出于好奇,我试图想出一个解决方案,如下所示:
(SQL-服务器 - 但也应该在 MySql)
中工作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/TBWZA82894
结果:
name | Jan | feb | mar |
---|---|---|---|
test1 | 2 | 1 | 0 |
test2 | 1 | 3 | 4 |
test3 | 1 | 0 | 0 |
或者,您可以更简单地这样做:
SELECT name,
COUNT(CASE WHEN jan=id THEN 1 END) jan,
COUNT(CASE WHEN feb=id THEN 1 END) feb,
COUNT(CASE WHEN mar=id THEN 1 END) mar
FROM employee
INNER JOIN projects ON id>0
GROUP BY name
在此处查看演示:https://rextester.com/DEUUE59264