 |
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
grsoft Aprendiz

Registrado: Segunda-Feira, 10 de Abril de 2006 Mensagens: 107
|
Enviada: Qui Out 24, 2019 3:12 pm Assunto: Dúvida SQL para gráfico |
|
|
Boa tarde pessoal, estou com uma dúvida de como construir uma SQL (banco MySQL) destinada para um gráfico, é o seguinte:
eu tenho uma tabela q contém todos as entregas realizadas para vários bairros e gostaria de saber como fazer uma SQL q me mostre a quantidade de entregas por bairro hora a hora por isso eu fiz a SQL abaixo:
SELECT COUNT(COD) as QUANTMOV, NOME, HORA from (
SELECT COD, BAIRRO AS NOME, TIME_FORMAT(CAST(DATAHORA as Time), '%H:00') as HORA
FROM MOVIMENTO
WHERE (DATAHORA BETWEEN '2019-10-01 00:00:00' AND '2019-10-23 23:59:59')
) tmp
group by HORA,NOME
order by NOME,HORA
o problema é q nessa SQL ele só mostra as horas que existem dentro do banco de dados e eu queria todas a horas do dia, de 00:00 até 23:00 ou até nos horários existentes no banco de dados, mas que o mais importante é que para cada bairro mostre todos os horário e que caso não tenha nenhum movimento em determinado horário, que ele mostre 0.
Agradeço antecipadamente toda a ajuda. |
|
Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qui Out 24, 2019 4:36 pm Assunto: |
|
|
Boa tarde,
Não tenho nenhuma experiência com o MySQL mas segue uma sugestão para testes:
Código: | SELECT
CASE WHEN t.HORA = h.HORA THEN t.QUANTMOV ELSE 0 END AS QUANTMOV,
t.NOME,
h.HORA
FROM
(
SELECT COUNT(COD) as QUANTMOV, NOME, HORA
from
(
SELECT COD, BAIRRO AS NOME, TIME_FORMAT(CAST(DATAHORA as Time), '%H:00') as HORA
FROM MOVIMENTO
WHERE (DATAHORA BETWEEN '2019-10-01 00:00:00' AND '2019-10-23 23:59:59')
) tmp
group by HORA,NOME
) t
CROSS JOIN
(
SELECT '00:00' AS HORA
UNION ALL
SELECT '01:00'
UNION ALL
SELECT '02:00'
UNION ALL
SELECT '03:00'
UNION ALL
SELECT '04:00'
) h
order by
NOME,
HORA |
Espero que ajude
Editado pela última vez por imex em Seg Set 20, 2021 10:01 am, num total de 1 vez |
|
Voltar ao Topo |
|
 |
grsoft Aprendiz

Registrado: Segunda-Feira, 10 de Abril de 2006 Mensagens: 107
|
Enviada: Qui Out 24, 2019 5:29 pm Assunto: |
|
|
imex escreveu: | Boa tarde,
Não tenho nenhuma experiência com o MySQL mas segue uma sugestão para testes:
Código: | SELECT
CASE WHEN t.HORA = h.HORA THEN t.QUANTMOV ELSE 0 END AS QUANTMOV,
t.NOME,
h.HORA
FROM
(
SELECT COUNT(COD) as QUANTMOV, NOME, HORA
from
(
SELECT COD, BAIRRO AS NOME, TIME_FORMAT(CAST(DATAHORA as Time), '%H:00') as HORA
FROM MOVIMENTO
WHERE (DATAHORA BETWEEN '2019-10-01 00:00:00' AND '2019-10-23 23:59:59')
) tmp
group by HORA,NOME
) t
CROSS JOIN
(
SELECT '00:00' AS HORA
UNION ALL
SELECT '01:00'
UNION ALL
SELECT '02:00'
UNION ALL
SELECT '03:00'
UNION ALL
SELECT '04:00'
) h
order by
NOME,
HORA |
Espero que ajude
|
muito obrigado meu amigo mas o resultado está meio estranho, vou tentar colocar aqui como está saindo:
Essa imagem é o resultado original
Essa é o resultado com a nova SQL
 |
|
Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qui Out 24, 2019 6:02 pm Assunto: |
|
|
Experimente essa versão com algumas alterações:
Código: | SELECT
SUM(CASE WHEN t.HORA = h.HORA THEN t.QUANTMOV ELSE 0 END) AS QUANTMOV,
t.NOME,
h.HORA
FROM
(
SELECT COUNT(COD) as QUANTMOV, NOME, HORA
from
(
SELECT COD, BAIRRO AS NOME, TIME_FORMAT(CAST(DATAHORA as Time), '%H:00') as HORA
FROM MOVIMENTO
WHERE (DATAHORA BETWEEN '2019-10-01 00:00:00' AND '2019-10-23 23:59:59')
) tmp
group by HORA,NOME
) t
CROSS JOIN
(
SELECT '00:00' AS HORA
UNION ALL
SELECT '01:00'
UNION ALL
SELECT '02:00'
UNION ALL
SELECT '03:00'
UNION ALL
SELECT '04:00'
) h
GROUP BY
t.NOME,
h,HORA
order by
NOME,
HORA |
Espero que ajude |
|
Voltar ao Topo |
|
 |
grsoft Aprendiz

Registrado: Segunda-Feira, 10 de Abril de 2006 Mensagens: 107
|
Enviada: Qui Out 24, 2019 6:23 pm Assunto: |
|
|
imex escreveu: | Experimente essa versão com algumas alterações:
Código: | SELECT
SUM(CASE WHEN t.HORA = h.HORA THEN t.QUANTMOV ELSE 0 END) AS QUANTMOV,
t.NOME,
h.HORA
FROM
(
SELECT COUNT(COD) as QUANTMOV, NOME, HORA
from
(
SELECT COD, BAIRRO AS NOME, TIME_FORMAT(CAST(DATAHORA as Time), '%H:00') as HORA
FROM MOVIMENTO
WHERE (DATAHORA BETWEEN '2019-10-01 00:00:00' AND '2019-10-23 23:59:59')
) tmp
group by HORA,NOME
) t
CROSS JOIN
(
SELECT '00:00' AS HORA
UNION ALL
SELECT '01:00'
UNION ALL
SELECT '02:00'
UNION ALL
SELECT '03:00'
UNION ALL
SELECT '04:00'
) h
GROUP BY
t.NOME,
h,HORA
order by
NOME,
HORA |
Espero que ajude |
Agora aparentemente deu tudo certo, MUITO obrigado meu amigo, vc sempre me salvando... |
|
Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|