在另一个查询MySQL中使用一个查询的SUM

时间:2019-02-03 20:48:59

标签: mysql sql join aggregate-functions

我有两个要一起使用的查询。

查询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会将hoursfull_name相同的重复条目加在一起hours_type。该查询的结果就是我希望查询1用于重复条目的结果。

SELECT   *, SUM(`hours`) AS `hours` 
FROM     `payroll` 
GROUP BY `full_name`, `hours_type`

我尝试了Union,Union All(由于某些原因,列的#有所不同,因此两者都不起作用。)尽管我尝试了多次子查询尝试,但我不太了解子查询的工作方式。任何帮助将不胜感激。 (我是SQL的新手。)

2 个答案:

答案 0 :(得分:0)

我怀疑您的两个查询可以按如下方式连接在一起:

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 *中不能很好地发挥作用。)

答案 1 :(得分:0)

感谢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似乎需要使用反向逻辑。