在另一个查询 MySQL 中使用一个查询的 SUM
Posted
技术标签:
【中文标题】在另一个查询 MySQL 中使用一个查询的 SUM【英文标题】:Using SUM from one query in another query MySQL 【发布时间】:2019-02-03 20:48:58 【问题描述】:我有两个要一起使用的查询。
查询 1 从工资表生成数据表。在工资表中,一个人在同一天可能有多个条目。因此,如果“hours_type”相同,我希望在此查询产生结果之前将小时数加在一起。
SELECT `payroll`.*, `personnel`.`assigned_shift`
FROM `payroll`, `personnel`
WHERE `payroll`.`full_name`= `personnel`.`full_name`
AND `payroll`.`date` = '$f_date'
AND `personnel`.`assigned_shift` IN ('A', 'B', 'C')
ORDER BY `personnel`.`assigned_shift` ASC;
查询 2 将 hours
一起添加到具有 full_name
和 hours_type
相同的重复条目。此查询的结果是我希望查询 #1 用于重复条目的结果。
SELECT *, SUM(`hours`) AS `hours`
FROM `payroll`
GROUP BY `full_name`, `hours_type`
我已经尝试过 Union,Union All (了解到这些都不起作用,因为列数由于某种原因不同。)尽管我在子查询中尝试了多次尝试,但我不太了解子查询的工作原理。任何帮助将不胜感激。 (我是 SQL 新手)。
【问题讨论】:
请提供样本数据和预期输出 【参考方案1】:我怀疑您的两个查询可以按如下方式连接在一起:
SELECT
pe.full_name,
pa.hours_type,
SUM(hours) hours
FROM
personel pe
LEFT JOIN payroll pa ON pa.full_name = pe.full_name AND pa.date = '$f_date'
WHERE
pe.assigned_shift IN ('A', 'B', 'C')
GROUP BY
pe.full_name,
pa.hours_type
ORDER BY p.assigned_shift
查询将personel
表的记录与payroll
表连接起来,并按人员全名和小时类型以及总小时聚合结果。
对于当天没有工资单的人员,将显示hours_type
和hours
列为空的记录。要不显示这些记录,您可以将LEFT JOIN
切换为INNER JOIN
。
您可以根据需要调整非聚合字段列表(pe.full_name
、'pa.hours_type
);每个非聚合字段也必须出现在GROUP BY
子句中。
关于你的sql代码的备注:
始终使用显式连接而不是隐式连接 除非确实必要,否则请避免使用反引号:它们会使查询更难阅读 使用表别名来缩短查询 避免SELECT *
:具体说明您要选择的列
在 mysql 的非古代版本中,所有非聚合列都必须出现在 GROUP BY
子句中(注意这与 SELECT *
不匹配)。
【讨论】:
谢谢!这就是在您回复之前我刚刚想出的办法。我正在使用连接。至于后面的勾号,玛丽亚 DB 不会认出我在没有它们的情况下在做什么。也许我也做错了? 欢迎@AWilkinson !是的,MariaDB 中可能需要反引号,我想这将属于unless really necessary
类别...【参考方案2】:
感谢 GMB 的回复。
就在他回复之前,我能够让它作为一个连接工作。这是我对可能有类似问题的任何人的工作查询。
SELECT `payroll`.*, `personnel`.`assigned_shift`, SUM(`hours`) AS `hours`
FROM `payroll`
INNER JOIN `personnel` ON `payroll`.`full_name` = `personnel`.`full_name`
WHERE `date` = '$f_date' AND `personnel`.`assigned_shift` IN ('A', 'B', 'C')
GROUP BY `full_name`, `hours_type`
ORDER BY `personnel`.`assigned_shift`, `personnel`.`l_name`
抱歉,MariaDB 似乎需要它们。
【讨论】:
以上是关于在另一个查询 MySQL 中使用一个查询的 SUM的主要内容,如果未能解决你的问题,请参考以下文章