Ir para conteúdo
Fórum Script Brasil
  • 0

Como trazer os resultados zerados?


nicol store

Pergunta

Tenho uma SQL que estou tentando rodar no Postgres, para que me retorne os valores diariamente por ano. Com uma ressalva, preciso que os dias restantes do mês de janeiro estejam sem os zeros para o ano de 2015. Consegui resolver esta questão dos dias seguintes virem nulos ao invés dos zeros. Mas os dias do mês que estão zerados nos quatro anos ele simplesmente não lista. Tais como os dias 4, 10, 12. Abaixo está o código e uma imagem do resultado. Como poderia fazer para que no resultado os anos que estão zerados traga o zero?

SELECT CASE DATE_PART('DAY', DATA) 
					when 01 then '01'
					when 02 then '02'
					when 03 then '03'
					when 04 then '04'
					when 05 then '05'
					when 06 then '06'
					when 07 then '07'
					when 08 then '08'
					when 09 then '09'
					when 10 then '10'
					when 11 then '11'
					when 12 then '12'
					when 13 then '13'
					when 14 then '14'
					when 15 then '15'
					when 16 then '16'
					when 17 then '17'
					when 18 then '18'
					when 19 then '19'
					when 20 then '20'
					when 21 then '21'
					when 22 then '22'
					when 23 then '23'
					when 24 then '24'
					when 25 then '25'
					when 26 then '26'
					when 27 then '27'
					when 28 then '28'
					when 29 then '29'
					when 30 then '30'
					when 31 then '31' end AS DIA_SEM,
		SUM(CASE WHEN date_part('year',data) = 2012 THEN 1 ELSE 0 END) AS "2012", 
		SUM(CASE WHEN date_part('year',data) = 2013 THEN 1 ELSE 0 END) AS "2013",
		SUM(CASE WHEN date_part('year',data) = 2014 THEN 1 ELSE 0 END) AS "2014",
		SUM(CASE WHEN date_part('day', "data") > date_part('day',CURRENT_DATE) THEN NULL 
		ELSE (CASE WHEN date_part('year',data) = 2015 THEN 1 ELSE 0 END) END) AS "2015",
		"count"(*) AS TOTAL
from admgis.controle_mortes
WHERE subjetividade = 'CVLI'
AND cidade = 'Arapiraca'
AND date_part('MONTH',data) = 01
GROUP BY DIA_SEM
ORDER BY DIA_SEM

2ebfqs5.jpg

Link para o comentário
Compartilhar em outros sites

10 respostass a esta questão

Posts Recomendados

  • 0
select
    to_char(gdata, 'DD') as dia_sem,
    count(date_part('year',data) = 2012 or null) as "2012",
    count(date_part('year',data) = 2013 or null) as "2013",
    count(date_part('year',data) = 2014 or null) as "2014",
    sum(case when date_part('year',data) = 2015 then 1 end) as "2015",
    count(*) as total
from
    admgis.controle_mortes cm
    right join
    generate_series (
        '2012-01-01'::timestamp, '2015-12-31', '1 day'
    ) g (gdata) on g.gdata = cm.data
where
    subjetividade = 'CVLI'
    and cidade = 'Arapiraca'
    and date_part('month',data) = 01
group by 1
order by 1
Editado por Kakao
Link para o comentário
Compartilhar em outros sites

  • 0

<script type='text/javascript'>window.mod_pagespeed_start = Number(new Date());</script>

select
    to_char(gdata, 'DD') as dia_sem,
    count(date_part('year',data) = 2012 or null) as "2012",
    count(date_part('year',data) = 2013 or null) as "2013",
    count(date_part('year',data) = 2014 or null) as "2014",
    sum(case when date_part('year',data) = 2015 then 1 end) as "2015",
    count(*) as total
from
    admgis.controle_mortes cm
    right join
    generate_series (
        '2012-01-01'::timestamp, '2015-12-31', '1 day'
    ) g (gdata) on g.gdata = cm.data
where
    subjetividade = 'CVLI'
    and cidade = 'Arapiraca'
    and date_part('month',data) = 01
group by 1
order by 1

Kakao muito obrigado pela atenção. Agora deu esse erro:

[Err] ERROR: function generate_series(timestamp without time zone, unknown, unknown) does not exist
LINE 11: generate_series (
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
Link para o comentário
Compartilhar em outros sites

  • 0

Se os anos que você quer que venham zero, estiverem vindo nulos, você pode usar coalesce para que quando for nulo, traga algo que você queria, por exemplo:

Select
  coalesce(ano,'00') 
from
  tabela 

No caso acima, caso o campo ano seja nulo, ele colocará '00'.

não sei se serve no seu caso.

Link para o comentário
Compartilhar em outros sites

  • 0

<script type='text/javascript'>window.mod_pagespeed_start = Number(new Date());</script>

Se os anos que você quer que venham zero, estiverem vindo nulos, você pode usar coalesce para que quando for nulo, traga algo que você queria, por exemplo:

Select
  coalesce(ano,'00') 
from
  tabela 

No caso acima, caso o campo ano seja nulo, ele colocará '00'.

não sei se serve no seu caso.

Muito obrigado pela atenção Dr. House. Não funcionou, os dias 4, 10, 12, 15 continuam sem vir.

Link para o comentário
Compartilhar em outros sites

  • 0
select
    to_char(gdata, 'DD') as dia_sem,
    count(date_part('year',data) = 2012 or null) as "2012",
    count(date_part('year',data) = 2013 or null) as "2013",
    count(date_part('year',data) = 2014 or null) as "2014",
    sum(case when date_part('year',data) = 2015 then 1 end) as "2015",
    count(*) as total
from
    admgis.controle_mortes cm
    right join
    generate_series (
        '2012-01-01'::timestamp,
        '2015-12-31'::timestamp,
        interval '1 day'
    ) g (gdata) on g.gdata = cm.data
where
    subjetividade = 'CVLI'
    and cidade = 'Arapiraca'
    and date_part('month',data) = 01
group by 1
order by 1
Qual é a versão?
Link para o comentário
Compartilhar em outros sites

  • 0

<script type='text/javascript'>window.mod_pagespeed_start = Number(new Date());</script>

select
    to_char(gdata, 'DD') as dia_sem,
    count(date_part('year',data) = 2012 or null) as "2012",
    count(date_part('year',data) = 2013 or null) as "2013",
    count(date_part('year',data) = 2014 or null) as "2014",
    sum(case when date_part('year',data) = 2015 then 1 end) as "2015",
    count(*) as total
from
    admgis.controle_mortes cm
    right join
    generate_series (
        '2012-01-01'::timestamp,
        '2015-12-31'::timestamp,
        interval '1 day'
    ) g (gdata) on g.gdata = cm.data
where
    subjetividade = 'CVLI'
    and cidade = 'Arapiraca'
    and date_part('month',data) = 01
group by 1
order by 1
Qual é a versão?

8.3.8

Link para o comentário
Compartilhar em outros sites

  • 0

O 8.3 não tem generate_series para datas. Tem que montar as datas a partir de uma série de inteiros:

select
    to_char(gdata, 'DD') as dia_sem,
    count(date_part('year',data) = 2012 or null) as "2012",
    count(date_part('year',data) = 2013 or null) as "2013",
    count(date_part('year',data) = 2014 or null) as "2014",
    sum(case when date_part('year',data) = 2015 then 1 end) as "2015",
    count(*) as total
from
    admgis.controle_mortes cm
    right join (
        select '2012-01-01'::date + i as gdata
        from generate_series (
            0, '2015-12-31'::date - '2012-01-01'::date
        ) g(i)
    ) g on g.gdata = cm.data
where
    subjetividade = 'CVLI'
    and cidade = 'Arapiraca'
    and date_part('month',data) = 01
group by 1
order by 1
Editado por Kakao
Link para o comentário
Compartilhar em outros sites

  • 0

<script type='text/javascript'>window.mod_pagespeed_start = Number(new Date());</script>

O 8.3 não tem generate_series para datas. Tem que montar as datas a partir de uma série de inteiros:

select
    to_char(gdata, 'DD') as dia_sem,
    count(date_part('year',data) = 2012 or null) as "2012",
    count(date_part('year',data) = 2013 or null) as "2013",
    count(date_part('year',data) = 2014 or null) as "2014",
    sum(case when date_part('year',data) = 2015 then 1 end) as "2015",
    count(*) as total
from
    admgis.controle_mortes cm
    right join (
        select '2012-01-01'::date + i as gdata
        from generate_series (
            0, '2015-12-31'::date - '2012-01-01'::date
        ) g(i)
    ) g on g.gdata = cm.data
where
    subjetividade = 'CVLI'
    and cidade = 'Arapiraca'
    and date_part('month',data) = 01
group by 1
order by 1

Kakao o resultado foi semelhante ao que consegui, entretanto os dias que não tiveram registros não foram listados, tais como dia 10, 12. Além disto essa sql colocou null nos dias anteriores ao dia de hoje no ano de 2015. Inclusive isso eu já até resolvi, o que estou precisando agora seria listar os dias que estão zerados nos 4 anos.

Link para o comentário
Compartilhar em outros sites

  • 0

Eu fiz algumas alterações e talvez agora fique mais fácil para me ajudar. O que eu preciso agora é que os dias após a data de hoje apareçam como NULL para o ano somente de 2015, por exemplo hoje é dia 19, dessa forma do dia 20 ao 31, no ano de 2015, os valores devem ser NULL. Abaixo está o código e o resultado.

SELECT date_part('year', data) as ano, 
		SUM(CASE WHEN date_part('day',data) = 1 THEN 1 ELSE 0 END)AS "01",
		SUM(CASE WHEN date_part('day',data) = 2 THEN 1 ELSE 0 END)AS "02",
		SUM(CASE WHEN date_part('day',data) = 3 THEN 1 ELSE 0 END)AS "03",
		SUM(CASE WHEN date_part('day',data) = 4 THEN 1 ELSE 0 END)AS "04",
		SUM(CASE WHEN date_part('day',data) = 5 THEN 1 ELSE 0 END)AS "05",
		SUM(CASE WHEN date_part('day',data) = 6 THEN 1 ELSE 0 END)AS "06",
		SUM(CASE WHEN date_part('day',data) = 7 THEN 1 ELSE 0 END)AS "07",
		SUM(CASE WHEN date_part('day',data) = 8 THEN 1 ELSE 0 END)AS "08",	
		SUM(CASE WHEN date_part('day',data) = 9 THEN 1 ELSE 0 END)AS "09",
		SUM(CASE WHEN date_part('day',data) = 10 THEN 1 ELSE 0 END)AS "10",
		SUM(CASE WHEN date_part('day',data) = 11 THEN 1 ELSE 0 END)AS "11",
		SUM(CASE WHEN date_part('day',data) = 12 THEN 1 ELSE 0 END)AS "12",
		SUM(CASE WHEN date_part('day',data) = 13 THEN 1 ELSE 0 END)AS "13",
		SUM(CASE WHEN date_part('day',data) = 14 THEN 1 ELSE 0 END)AS "14",
		SUM(CASE WHEN date_part('day',data) = 15 THEN 1 ELSE 0 END)AS "15",
		SUM(CASE WHEN date_part('day',data) = 16 THEN 1 ELSE 0 END)AS "16",
		SUM(CASE WHEN date_part('day',data) = 17 THEN 1 ELSE 0 END)AS "17",
		SUM(CASE WHEN date_part('day',data) = 18 THEN 1 ELSE 0 END)AS "18",
		SUM(CASE WHEN date_part('day',data) = 19 THEN 1 ELSE 0 END)AS "19",
		SUM(CASE WHEN date_part('day',data) = 20 THEN 1 ELSE 0 END)AS "20",
		SUM(CASE WHEN date_part('day',data) = 21 THEN 1 ELSE 0 END)AS "21",
		SUM(CASE WHEN date_part('day',data) = 22 THEN 1 ELSE 0 END)AS "22",
		SUM(CASE WHEN date_part('day',data) = 23 THEN 1 ELSE 0 END)AS "23",
		SUM(CASE WHEN date_part('day',data) = 24 THEN 1 ELSE 0 END)AS "24",
		SUM(CASE WHEN date_part('day',data) = 25 THEN 1 ELSE 0 END)AS "25",
		SUM(CASE WHEN date_part('day',data) = 26 THEN 1 ELSE 0 END)AS "26",
		SUM(CASE WHEN date_part('day',data) = 27 THEN 1 ELSE 0 END)AS "27",
		SUM(CASE WHEN date_part('day',data) = 28 THEN 1 ELSE 0 END)AS "28",
		SUM(CASE WHEN date_part('day',data) = 29 THEN 1 ELSE 0 END)AS "29",
		SUM(CASE WHEN date_part('day',data) = 30 THEN 1 ELSE 0 END)AS "30",
		SUM(CASE WHEN date_part('day',data) = 31 THEN 1 ELSE 0 END)AS "31",
COUNT(*) as Total
from admgis.controle_mortes
WHERE subjetividade = 'CVLI'
AND date_part('MONTH',data) = 01
AND UPPER(cidade) = 'ARAPIRACA'
GROUP BY ano
ORDER BY ano;

1sfuao.jpg

Link para o comentário
Compartilhar em outros sites

  • 0

Essa foi a solução encontrada. Agora traz os dias NULL do dia atual até o final do mês.

SELECT date_part('year', data)as ano	, 
SUM(CASE WHEN date_part('day',data) = '1' THEN 1 ELSE (CASE WHEN ('1' <= date_part('day', now()) OR date_part('year', now()) <> date_part('year', data)) THEN 0 ELSE null END) END) AS "01",
SUM(CASE WHEN date_part('day',data) = '2' THEN 1 ELSE (CASE WHEN ('2' <= date_part('day', now()) OR date_part('year', now()) <> date_part('year', data)) THEN 0 ELSE null END) END) AS "02",
SUM(CASE WHEN date_part('day',data) = '3' THEN 1 ELSE (CASE WHEN ('3' <= date_part('day', now()) OR date_part('year', now()) <> date_part('year', data)) THEN 0 ELSE null END) END) AS "03",
SUM(CASE WHEN date_part('day',data) = '4' THEN 1 ELSE (CASE WHEN ('4' <= date_part('day', now()) OR date_part('year', now()) <> date_part('year', data)) THEN 0 ELSE null END) END) AS "04",
SUM(CASE WHEN date_part('day',data) = '5' THEN 1 ELSE (CASE WHEN ('5' <= date_part('day', now()) OR date_part('year', now()) <> date_part('year', data)) THEN 0 ELSE null END) END) AS "05",
SUM(CASE WHEN date_part('day',data) = '6' THEN 1 ELSE (CASE WHEN ('6' <= date_part('day', now()) OR date_part('year', now()) <> date_part('year', data)) THEN 0 ELSE null END) END) AS "06",
SUM(CASE WHEN date_part('day',data) = '7' THEN 1 ELSE (CASE WHEN ('7' <= date_part('day', now()) OR date_part('year', now()) <> date_part('year', data)) THEN 0 ELSE null END) END) AS "07",
SUM(CASE WHEN date_part('day',data) = '8' THEN 1 ELSE (CASE WHEN ('8' <= date_part('day', now()) OR date_part('year', now()) <> date_part('year', data)) THEN 0 ELSE null END) END) AS "08",
SUM(CASE WHEN date_part('day',data) = '9' THEN 1 ELSE (CASE WHEN ('9' <= date_part('day', now()) OR date_part('year', now()) <> date_part('year', data)) THEN 0 ELSE null END) END) AS "09",
SUM(CASE WHEN date_part('day',data) = '10' THEN 1 ELSE (CASE WHEN ('10' <= date_part('day', now()) OR date_part('year', now()) <> date_part('year', data)) THEN 0 ELSE null END) END) AS "10",
SUM(CASE WHEN date_part('day',data) = '11' THEN 1 ELSE (CASE WHEN ('11' <= date_part('day', now()) OR date_part('year', now()) <> date_part('year', data))THEN 0 ELSE null END) END) AS "11",
SUM(CASE WHEN date_part('day',data) = '12' THEN 1 ELSE (CASE WHEN ('12' <= date_part('day', now()) OR date_part('year', now()) <> date_part('year', data)) THEN 0 ELSE null END) END) AS "12",
SUM(CASE WHEN date_part('day',data) = '13' THEN 1 ELSE (CASE WHEN ('13' <= date_part('day', now()) OR date_part('year', now()) <> date_part('year', data)) THEN 0 ELSE null END) END) AS "13",
SUM(CASE WHEN date_part('day',data) = '14' THEN 1 ELSE (CASE WHEN ('14' <= date_part('day', now()) OR date_part('year', now()) <> date_part('year', data)) THEN 0 ELSE null END) END) AS "14",
SUM(CASE WHEN date_part('day',data) = '15' THEN 1 ELSE (CASE WHEN ('15' <= date_part('day', now()) OR date_part('year', now()) <> date_part('year', data)) THEN 0 ELSE null END) END) AS "15",
SUM(CASE WHEN date_part('day',data) = '16' THEN 1 ELSE (CASE WHEN ('16' <= date_part('day', now()) OR date_part('year', now()) <> date_part('year', data)) THEN 0 ELSE null END) END) AS "16",
SUM(CASE WHEN date_part('day',data) = '17' THEN 1 ELSE (CASE WHEN ('17' <= date_part('day', now()) OR date_part('year', now()) <> date_part('year', data)) THEN 0 ELSE null END) END) AS "17",
SUM(CASE WHEN date_part('day',data) = '18' THEN 1 ELSE (CASE WHEN ('18' <= date_part('day', now()) OR date_part('year', now()) <> date_part('year', data)) THEN 0 ELSE null END) END) AS "18",
SUM(CASE WHEN date_part('day',data) = '19' THEN 1 ELSE (CASE WHEN ('19' <= date_part('day', now()) OR date_part('year', now()) <> date_part('year', data)) THEN 0 ELSE null END) END) AS "19",
SUM(CASE WHEN date_part('day',data) = '20' THEN 1 ELSE (CASE WHEN ('20' <= date_part('day', now()) OR date_part('year', now()) <> date_part('year', data)) THEN 0 ELSE null END) END) AS "20",
SUM(CASE WHEN date_part('day',data) = '21' THEN 1 ELSE (CASE WHEN ('21' <= date_part('day', now()) OR date_part('year', now()) <> date_part('year', data))THEN 0 ELSE null END) END) AS "21",
SUM(CASE WHEN date_part('day',data) = '22' THEN 1 ELSE (CASE WHEN ('22' <= date_part('day', now()) OR date_part('year', now()) <> date_part('year', data)) THEN 0 ELSE null END) END) AS "22",
SUM(CASE WHEN date_part('day',data) = '23' THEN 1 ELSE (CASE WHEN ('23' <= date_part('day', now()) OR date_part('year', now()) <> date_part('year', data))THEN 0 ELSE null END) END) AS "23",
SUM(CASE WHEN date_part('day',data) = '24' THEN 1 ELSE (CASE WHEN ('24' <= date_part('day', now()) OR date_part('year', now()) <> date_part('year', data)) THEN 0 ELSE null END) END) AS "24",
SUM(CASE WHEN date_part('day',data) = '25' THEN 1 ELSE (CASE WHEN ('25' <= date_part('day', now()) OR date_part('year', now()) <> date_part('year', data)) THEN 0 ELSE null END) END) AS "25",
SUM(CASE WHEN date_part('day',data) = '26' THEN 1 ELSE (CASE WHEN ('26' <= date_part('day', now()) OR date_part('year', now()) <> date_part('year', data)) THEN 0 ELSE null END) END) AS "26",
SUM(CASE WHEN date_part('day',data) = '27' THEN 1 ELSE (CASE WHEN ('27' <= date_part('day', now()) OR date_part('year', now()) <> date_part('year', data)) THEN 0 ELSE null END) END) AS "27",
SUM(CASE WHEN date_part('day',data) = '28' THEN 1 ELSE (CASE WHEN ('28' <= date_part('day', now()) OR date_part('year', now()) <> date_part('year', data)) THEN 0 ELSE null END) END) AS "28",
SUM(CASE WHEN date_part('day',data) = '29' THEN 1 ELSE (CASE WHEN ('29' <= date_part('day', now()) OR date_part('year', now()) <> date_part('year', data)) THEN 0 ELSE null END) END) AS "29",
SUM(CASE WHEN date_part('day',data) = '30' THEN 1 ELSE (CASE WHEN ('30' <= date_part('day', now()) OR date_part('year', now()) <> date_part('year', data)) THEN 0 ELSE null END) END) AS "30",
SUM(CASE WHEN date_part('day',data) = '31' THEN 1 ELSE (CASE WHEN ('31' <= date_part('day', now()) OR date_part('year', now()) <> date_part('year', data)) THEN 0 ELSE null END) END) AS "31",
COUNT(*) as Total
from controle_mortes
WHERE subjetividade = 'CVLI'
AND date_part('MONTH', data) = 01
AND UPPER(cidade) = 'ARAPIRACA'
GROUP BY ano
ORDER BY ano;

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...