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

问题描述 投票:1回答:2

我有我试图同时使用两个查询。

查询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`

我已经试过联盟,联盟所有(学既不是列#是由于某种原因,不同的工作。)我不太明白如何子查询在子查询的工作,虽然我已经尝试了多种尝试。任何帮助将不胜感激。 (我是新来的SQL)。

mysql sql join aggregate-functions
2个回答
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

查询联接与personelpayroll表中的记录,并聚集由企业人事全名和小时类型的结果,总时间一起。

对于没有在这一天工资企业人事,将显示空hours_typehours列的记录。为了不显示这些记录,可以切换到LEFT JOIN INNER JOIN

您可以适应非aggragated场(pe.full_name,“pa.hours_type)如你所愿的列表;每一个非聚集领域也必须出现在GROUP BY子句。

备注您的SQL代码:

  • 始终使用显式联接,而不是隐含的加入
  • 避免使用反引号,除非确有必要:他们所做的查询难以阅读
  • 使用表别名来缩短查询
  • 避免SELECT *:要具体说明要选择列
  • 在非古老的版本在MySQL,所有非聚合列必须出现在GROUP BY子句中(注意,这不符合SELECT *发挥好)。

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的人似乎都需要它们。

© www.soinside.com 2019 - 2024. All rights reserved.