Reputation: 128
I have this query:
SELECT YEAR(`data`) AS ano, SUM(ativo) AS tempo_ativo
FROM rh.processamento
GROUP BY YEAR(`data`);
The result from this query is
ano tempo_ativo
2015 108247387
2016 172003845
And this query:
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`);
The result is:
ano tempo_extra
0 8768100
2015 -4410782
2016 -7213369
I made this query to join the results from both queries:
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`);
But the results are wrong. I need the results to be something like this:
ano tempo_ativo tempo_extra
0 NULL 8768100
2015 108247387 -4410782
2016 172003845 -7213369
Can you you guys help me?
Upvotes: 1
Views: 48
Reputation: 202
In order to have all the "ano" that are listed in your aprovacoes table even if there is no corrsponding "ano" rows in your processamento table you should make the left join like this :
SELECT * FROM rh.aprovacoes LEFT JOIN rh.processamento ON processamento.ano=aprovacoes.ano AND ....
You can after that make your GROUP BY YEAR(aprovacoes.data)
For more info about the LEFT JOIN Clause look at this article : http://www.w3schools.com/sql/sql_join_left.asp
I hope it will help you.
Upvotes: 0
Reputation: 587
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`);
left join will only return a row if it exists in the first table. full join will return rows from both tables.
but since you cant do full outer joins in mySQL you have to emulate it.
Full Outer Join in MySQL so do the left join, then do the right join and union the 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`);
Upvotes: 0
Reputation: 3756
Try This
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`);
Upvotes: 0
Reputation: 72165
If the second query always returns all records of the first one, then you can try using a 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
Upvotes: 1
Reputation: 6065
Try this:
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)
Upvotes: 0