Mysql 我需要计算每个员工每月的平均产量
我需要创建一份报告,显示平均每天至少生产30件的员工 我有两张桌子:Mysql 我需要计算每个员工每月的平均产量,mysql,sql,mysql-workbench,Mysql,Sql,Mysql Workbench,我需要创建一份报告,显示平均每天至少生产30件的员工 我有两张桌子: Employees: id, name, surname Production: id, date_time, id_employee, [..], quantity_produced 员工表中的id=生产表中的id\u员工 或 或 对于过滤器聚合结果,您需要having子句 SELECT name, surname, Avg(quantity_produced), Month(date_time) Mnth FROM p
Employees: id, name, surname
Production: id, date_time, id_employee, [..], quantity_produced
员工表中的id=生产表中的id\u员工
或 或
对于过滤器聚合结果,您需要having子句
SELECT name, surname, Avg(quantity_produced), Month(date_time) Mnth
FROM production
inner join employees on employees.id = production.id_employee
GROUP BY name, surname, Month(date_time)
having Avg(quantity_produced) > 30 ;
还有一年
SELECT name, surname, Avg(quantity_produced), Month(date_time) Mnth, year(date_time) year
FROM production
inner join employees on employees.id = production.id_employee
GROUP BY name, surname, Month(date_time), year(date_time) year
having Avg(quantity_produced) > 30 ;
在使用月份时,您应该确保也考虑了年份:
SELECT year(p.data_ora) as yyyy, month(p.data_ora) as mm,
e.name, e.surname, avg(p.quantity_produced),
FROM production p inner join
employees e
on e.id = p.id_employee
GROUP BY year(p.data_ora), month(p.data_ora,
e.name, e.surname
HAVING avg(p.quantity_produced) >= 30
ORDER BY year(p.data_ora), month(p.data_ora),
e.name, e.surname;
这假设生产
具有员工每天工作的产量
注:
- 当表引用多个表时,限定所有列引用
- 使用表别名,以便更易于编写和读取查询
- 记住这一年!(当您使用月份时)
SELECT
Production.id_employee,
AVG(Production.quantity_produced)
FROM
Production
WHERE
Production.date_time BETWEEN
(LAST_DAY(NOW()) + INTERVAL 1 DAY) - INTERVAL 1 MONTH # first day of current month
AND
LAST_DAY(NOW()) # last day of current month
GROUP BY
Production.id_employee
查询何时需要员工记录:
SELECT
Employees.name,
Employees.surname,
AVG(Production.quantity_produced)
FROM
Production
INNER JOIN
Employees ON Production.id_employee = Employees.id
WHERE
Production.date_time BETWEEN
(LAST_DAY(NOW()) + INTERVAL 1 DAY) - INTERVAL 1 MONTH # first day of current month
AND
LAST_DAY(NOW()) # last day of current month
GROUP BY
Employees.id
注意,上面的查询假设至少有MySQL 5.7.5+和SQL 1999+标准可选特性,称为
看
或者作为相关联的子查询:如果索引正确,这应该是好的
SELECT
(SELECT Employees.name FROM Employees.id = Production.id_employee) AS name,
(SELECT Employees.surname FROM Employees.id = Production.id_employee) AS surname,
AVG(Production.quantity_produced)
FROM
Production
WHERE
Production.date_time BETWEEN
(LAST_DAY(NOW()) + INTERVAL 1 DAY) - INTERVAL 1 MONTH # first day of current month
AND LAST_DAY(NOW()) # last day of current month
GROUP BY
Production.id_employee
您是否需要计算所有年份中所有月份的平均值???给定的查询有什么问题?您可以分享哪些功能可以使用,以及您需要帮助的地方吗?公平警告:上述查询假设至少有MySQL 5.7.5+和SQL 1999+标准可选功能,称为。。。请看,我是根据MS SQL Server标准编写的。那么您的SQL应该会失败,因为SQL Server不支持此类查询,因为E.name不在GROUP BY中。。SQL Server不支持功能依赖性非常感谢您指出这一点。你说得对。根据我的理解,如果我们只在这两个地方使用ID(group by和select),那么它的性能会更好。因为大多数时候id是主键(或者你可以说是聚集索引),它会使它更快。写上名字会让事情变得有点慢。你怎么认为。
SELECT
Production.id_employee,
AVG(Production.quantity_produced)
FROM
Production
WHERE
Production.date_time BETWEEN
(LAST_DAY(NOW()) + INTERVAL 1 DAY) - INTERVAL 1 MONTH # first day of current month
AND
LAST_DAY(NOW()) # last day of current month
GROUP BY
Production.id_employee
SELECT
Employees.name,
Employees.surname,
AVG(Production.quantity_produced)
FROM
Production
INNER JOIN
Employees ON Production.id_employee = Employees.id
WHERE
Production.date_time BETWEEN
(LAST_DAY(NOW()) + INTERVAL 1 DAY) - INTERVAL 1 MONTH # first day of current month
AND
LAST_DAY(NOW()) # last day of current month
GROUP BY
Employees.id
SELECT
(SELECT Employees.name FROM Employees.id = Production.id_employee) AS name,
(SELECT Employees.surname FROM Employees.id = Production.id_employee) AS surname,
AVG(Production.quantity_produced)
FROM
Production
WHERE
Production.date_time BETWEEN
(LAST_DAY(NOW()) + INTERVAL 1 DAY) - INTERVAL 1 MONTH # first day of current month
AND LAST_DAY(NOW()) # last day of current month
GROUP BY
Production.id_employee
I think this should work , can you please try it once. And may be little modification required, Comment here I will try to do the fixes.
1.Select
E.id "Employee ID",
E.name "Employee Name",
Month(P.date_time) "Month",
AVG(P.quantity_produced) "Quantity Produced"
From Employee as E
Join Production as P on E.id=P. id_employee
Group by
E.id,E.name,Month(P.date_time)
Having Avg(P.quantity_produced) > 30
2.Select
E.name "Employee Name",
Month(P.date_time) "Month",
AVG(P.quantity_produced) "Quantity Produced"
From Employee as E
Join Production as P on E.id=P. id_employee
Group by
E.name,Month(P.date_time)
Having Avg(P.quantity_produced) > 30