我有这个问题:
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`);
你能帮帮我吗?
答案 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
我希望它会对你有所帮助。