加入2个查询结果

时间:2016-03-11 11:08:34

标签: mysql sql

我有这个问题:

123456|2016-03-10T09:30:25.000|abcd|efdgh|1245|2016-03-10T18:30:25.000

654321|2016-03-10T15:30:25.000|abcd|efdgh|1245|2016-03-10T23:30:25.000

此查询的结果是

SELECT YEAR(`data`) AS ano, SUM(ativo) AS tempo_ativo
FROM rh.processamento
GROUP BY YEAR(`data`);

这个查询:

ano tempo_ativo
2015 108247387
2016 172003845

结果是:

SELECT YEAR(`data`) AS ano, SUM(tempo) AS tempo_extra
FROM rh.aprovacoes
WHERE tipo = 'BH' OR tipo = 'HE' AND estado=1
GROUP BY YEAR(`data`);

我做了这个查询来加入两个查询的结果:

ano tempo_extra
0    8768100
2015  -4410782
2016  -7213369

但结果是错误的。 我需要结果是这样的:

SELECT YEAR(processamento.`data`) AS ano, SUM(ativo) AS tempo_ativo, SUM(tempo)/3600 AS tempo_extra
FROM rh.processamento
LEFT JOIN rh.aprovacoes ON processamento.`data`=aprovacoes.`data` AND (tipo = 'BH' OR tipo = 'HE') AND estado=1
GROUP BY YEAR(aprovacoes.`data`);
你能帮帮我吗?

5 个答案:

答案 0 :(得分:1)

如果第二个查询始终返回第一个查询的所有记录,那么您可以尝试使用LEFT JOIN

SELECT t1.ano, tempo_extra, tempo_ativo
FROM (
   SELECT YEAR(`data`) AS ano, SUM(tempo) AS tempo_extra
   FROM rh.aprovacoes
   WHERE tipo = 'BH' OR tipo = 'HE' AND estado=1
   GROUP BY YEAR(`data`)
) AS t1
LEFT JOIN (
   SELECT YEAR(`data`) AS ano, SUM(ativo) AS tempo_ativo
   FROM rh.processamento
   GROUP BY YEAR(`data`) 
) AS t2 ON t1.ano = t2.ano

答案 1 :(得分:0)

试试这个:

SELECT  *
FROM 
(
    SELECT YEAR(`data`) AS ano, SUM(tempo) AS tempo_extra
    FROM rh.aprovacoes
    WHERE tipo = 'BH' OR tipo = 'HE' AND estado=1
    GROUP BY YEAR(`data`)
) t1
LEFT JOIN
(
    SELECT YEAR(`data`) AS ano, SUM(ativo) AS tempo_ativo
    FROM rh.processamento
    GROUP BY YEAR(`data`)
) t2
USING(ano)

答案 2 :(得分:0)

SELECT YEAR(processamento.`data`) AS ano, SUM(ativo) AS tempo_ativo, SUM(tempo)/3600 AS tempo_extra
FROM rh.processamento
FULL OUTER JOIN rh.aprovacoes ON processamento.`data`=aprovacoes.`data` AND (tipo = 'BH' OR tipo = 'HE') AND estado=1
GROUP BY YEAR(aprovacoes.`data`);

左连接只会在第一个表中存在时返回一行。 完全连接将返回两个表中的行。

但是由于你无法在mySQL中进行完全外连接,你必须模仿它。

Full Outer Join in MySQL 左连接也是如此,然后进行右连接并将2连接起来。

    SELECT YEAR(processamento.`data`) AS ano, SUM(ativo) AS tempo_ativo, SUM(tempo)/3600 AS tempo_extra
    FROM rh.processamento
    Left JOIN rh.aprovacoes ON processamento.`data`=aprovacoes.`data` AND (tipo = 'BH' OR tipo = 'HE') AND estado=1
    GROUP BY YEAR(aprovacoes.`data`);

union

    SELECT YEAR(processamento.`data`) AS ano, SUM(ativo) AS tempo_ativo, SUM(tempo)/3600 AS tempo_extra
    FROM rh.processamento
    Right JOIN rh.aprovacoes ON processamento.`data`=aprovacoes.`data` AND (tipo = 'BH' OR tipo = 'HE') AND estado=1
    GROUP BY YEAR(aprovacoes.`data`);

答案 3 :(得分:0)

试试这个

SELECT YEAR(`a`,`data`) AS ano, SUM(tempo) AS tempo_extra,
SUM(ativo) AS tempo_ativo
FROM rh.aprovacoes a LEFT JOIN rh.processamento b 
ON YEAR(`a`.`data`) = YEAR(`b`.`data`)
AND estado=1
WHERE tipo = 'BH' OR tipo = 'HE' 
GROUP BY YEAR(`a`.`data`);

答案 4 :(得分:0)

为了拥有所有" ano"即使没有相应的" ano"你的 processamento 表中的行应该像这样进行左连接:

GROUP BY YEAR(aprovacoes.data)

您可以在此之后制作{{1}}

有关LEFT JOIN子句的更多信息,请查看本文: http://www.w3schools.com/sql/sql_join_left.asp

我希望它会对你有所帮助。