Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Galera,
Tenho a seguinte query
SELECT DATE_FORMAT(rel_nf.date,"%Y-%m") AS data_nota,
DATE_FORMAT(rel_nf.date,"%Y-%m") AS data_saida,
SUM(rel_nf.valor) AS valor_nota,
SUM(rel_nf.valor) AS vl_tot,
SUM(rel_nf.volume) AS volume_nota,
SUM(rel_nf.volume) AS volume_residuo,
UPPER(rel_nf.residuo_nome) AS residuo_nome
FROM rel_notas_fiscais AS rel_nf
INNER JOIN rel_residuos ON rel_residuos.id = rel_nf.id_residuo
INNER JOIN notas_fiscais AS nf ON rel_nf.id_nf = nf.id
WHERE `nf`.`id_gerador` = 10
AND `rel_nf`.`excluido` = 0
AND `rel_nf`.`reciclavel` = 0
AND `rel_residuos`.`peso` <> 'un'
AND `rel_nf`.`date` BETWEEN '2016-02-01' AND '2017-02-09'
GROUP BY rel_nf.date,
rel_nf.residuo_nome,
rel_nf.reciclavel
O problema é o seguinte, se no mes 02 eu nao tenho resultado ele não traz nada , apenas aonde tenho registro , e eu precisava que trazesse pelo menos com 0 ou nul porque essa query vai para um grafico e a linha precisa se manter constante pra vcs entederem
2016-09 REGISTRO1 REGISTRO 2 RESGITSRO3
2016-10 REGISTRO1 REGISTRO 2 RESGITSRO3
2016-11 REGISTRO1 REGISTRO 2 RESGITSRO3
Só que em fevereiro e janeiro de 2017 nao trouxe nada , precisava que me trouxesse assim por causa do between '2016-02-01' AND '2017-02-09'
2016-09 REGISTRO1 REGISTRO 2 RESGITSRO3
2016-10 REGISTRO1 REGISTRO 2 RESGITSRO3
2016-11 REGISTRO1 REGISTRO 2 RESGITSRO3
2016-12 NULL NULL NULL
2017-01 NULL NULL NULL
2017-02 NULL NULL NULL
Para manter a linha constante em 0 se não houver registro , acho que fui claro no meu problema, quem puder me ajudar agradeço !
Valeu
Nao funcionou preciso que traga as datas que foi introduzidas no between houvendo registro ou nao, com LEFT join trouxe os mesmo registros
Favor atualizar a sua query. Você também deve modificar o WHERE, pois mesmo se utilizando LEFT e no WHERE estiver alguma restrição de um campo dessa tabela, não irá trazer o registro.
A query é a mesma acho que você nao entendeu , nao tem registro em janeiro e fevereiro os where tem q ser assim porem quando nao tem registro quero trazer as datas e null
SELECT DATE_FORMAT(rel_nf.date,"%Y-%m") AS data_nota,
DATE_FORMAT(rel_nf.date,"%Y-%m") AS data_saida,
SUM(rel_nf.valor) AS valor_nota,
SUM(rel_nf.valor) AS vl_tot,
SUM(rel_nf.volume) AS volume_nota,
SUM(rel_nf.volume) AS volume_residuo,
UPPER(rel_nf.residuo_nome) AS residuo_nome
FROM rel_notas_fiscais AS rel_nf
INNER JOIN rel_residuos ON rel_residuos.id = rel_nf.id_residuo
INNER JOIN notas_fiscais AS nf ON rel_nf.id_nf = nf.id
WHERE `nf`.`id_gerador` = 10
AND `rel_nf`.`excluido` = 0
AND `rel_nf`.`reciclavel` = 0
AND `rel_residuos`.`peso` <> 'un'
AND `rel_nf`.`date` BETWEEN '2016-02-01' AND '2017-02-09'
GROUP BY rel_nf.date,
rel_nf.residuo_nome,
rel_nf.reciclavel
O que quero que prevaleça é a between
Ahhh, ai é outra história.
Tente algo como:
SELECT
MONTH(date),
/** jois e outras colunas **/
FROM
tbl
JOIN ...
WHERE
date >= '2017-01-01' AND date < '2017-01-01' + INTERVAL 1 YEAR
GROUP BY
MONTH(date);
Dessa forma, sua base é o intervalo de meses e não as datas de registro.Voce diz pra eu fazer subquery???
Tentei colocar um group by pelo MONTH(date)
subquery não, apenas joins. O group by month deve lhe trazer o registro de meses, ai basta relacionar o registro de cada mês. No momento, não tenho mysql para testar essa situação.
Tentei
SELECT
MONTH(date)
FROM `rel_notas_fiscais` AS `rel_nf`
INNER JOIN `rel_residuos` ON `rel_residuos`.`id` = `rel_nf`.`id_residuo`
INNER JOIN `notas_fiscais` AS `nf` ON `rel_nf`.`id_nf` = `nf`.`id`
WHERE `rel_nf`.`date` BETWEEN '2016-02-01' AND '2017-02-09'
GROUP BY MONTH(date);
Mas nao traz o mes 01 e 02 que nao contem registro @Motta tem alguma solução?Esqueça meu exemplo, acabei fazendo um exemplo equivocado. Assim que eu tiver como testar em MySQL eu volto a postar aqui.
tentei com subquery sem sucesso aqui tambem.
Quando você relaciona apenas com INNER JOIN, a query só trará itens em que a relação foi bem sucedida.
Você vai utilizar em seu primeiro JOIN, o LEFT JOIN, pois aí ele vai trazer todos os resultados da tabela da esquerda, independente de haver uma relação ou não.