在另一个查询 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_namehours_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_typehours 列为空的记录。要不显示这些记录,您可以将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的主要内容,如果未能解决你的问题,请参考以下文章

mysql - 在另一个查询中嵌入计数查询

为啥在另一个数据库中执行相同查询时不使用索引?

mysql 查询一个表中没有存在在另一个表的数据

如何在另一个表的列中插入选择查询的结果

SQL Server中的SUM,在JOIN的一侧有多行,另一侧在另一侧作为比较

使用 SUM 时提高 MySQL 查询性能