Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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
/applications/core/interface/imageproxy/imageproxy.php?img=http://i59.tinypic.com/2ebfqs5.jpg&key=37673099b942f2c0f0f37611f554b78f1e9b4ae29ffface7fce69536e594486f" alt="2ebfqs5.jpg" />
>
http://forum.imasters.com.br/topic/531156-consulta-sql/
Veja se ajuda, a partir do #4
Não estou conseguindo trazer seu exemplo para minha realidade.
--gerar uma sequencia no postgree
select row_number() over() as id
from information_schema.tables t
where id < 32
--gerar datas em sequencia
select date '2001-12-31 + row_number() over() as datax
from information_schema.tables t
where id < 32
--gerar os "dia"
SELECT CASE DATE_PART('DAY', DATAx)
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,
0 AS "2012",
0 "2013",
0 AS "2014",
0 AS "2015",
0 AS (select date '2001-09-28' + row_number() over() as datax
from information_schema.tables t
where id < 32)
-- union
select dia_sem,
sum(2012),
sum(2013),
sum(2014),
sum(2015),
sum(total)
from
(
SELECT CASE DATE_PART('DAY', DATAx)
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
union all
SELECT CASE DATE_PART('DAY', DATAx)
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,
0 AS "2012",
0 "2013",
0 AS "2014",
0 AS "2015",
0 AS (select date '2001-09-28' + row_number() over() as datax
from information_schema.tables t
where id < 32)
) group by DIA_SEM
Feito no notepad , não tive como testar ....>
--gerar uma sequencia no postgree
select row_number() over() as id
from information_schema.tables t
where id < 32
--gerar datas em sequencia
select date '2001-12-31 + row_number() over() as datax
from information_schema.tables t
where id < 32
--gerar os "dia"
SELECT CASE DATE_PART('DAY', DATAx)
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,
0 AS "2012",
0 "2013",
0 AS "2014",
0 AS "2015",
0 AS (select date '2001-09-28' + row_number() over() as datax
from information_schema.tables t
where id < 32)
-- union
select dia_sem,
sum(2012),
sum(2013),
sum(2014),
sum(2015),
sum(total)
from
(
SELECT CASE DATE_PART('DAY', DATAx)
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
union all
SELECT CASE DATE_PART('DAY', DATAx)
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,
0 AS "2012",
0 "2013",
0 AS "2014",
0 AS "2015",
0 AS (select date '2001-09-28' + row_number() over() as datax
from information_schema.tables t
where id < 32)
) group by DIA_SEM
Feito no notepad , não tive como testar ....
Motta muito obrigado pela atenção.
Já no primeiro select dá este erro:
Erro de SQL:
ERROR: syntax error at or near "over"
LINE 1: select row_number() over() as id
^
Daí as demais SQL não funcionam. Meu Postgres é 8.3.8.
Tente ...
0 AS "2014",
0 AS "2015",
0 AS (select date '2001-09-28' + row_number() over() as datax
from information_schema.tables t
where row_number() over() < 32)
...
Mas não estou certo
>
Tente ...
0 AS "2014",
0 AS "2015",
0 AS (select date '2001-09-28' + row_number() over() as datax
from information_schema.tables t
where row_number() over() < 32)
...
Mas não estou certo
Motta também não funcionou. Eu preciso que os dias que estão zerados nos 4 anos apareçam no resultado. Eu já consegui resolver para trazer null ao invés de 0 nos dias apartir da data de hoje até o fim do mês, para o ano de 2015. Mas como por exemplo no dia 4, 10, 12 não tiveram registros, os mesmos não são listados.
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;
/applications/core/interface/imageproxy/imageproxy.php?img=http://oi59.tinypic.com/1sfuao.jpg&key=c3243c6bf9a67552f359c8d7c4b7c016d1b265c7073b2273d48b5eb5758a8c64" alt="1sfuao.jpg" />
Atente que o union que acrescentei é para trazer uma série "fajuta" de datas , manipule este sql para o intervalo de data requerido.
select date '2011-12-31 + row_number() over() as datax
from information_schema.tables t
where id < ((365 * 4)+1)
Estas datas são geradas zeradas para somar as datas existentes , se a data existir na série não é alterada pois se soma zero, se não existir aparece como 0.
>
Atente que o union que acrescentei é para trazer uma série "fajuta" de datas , manipule este sql para o intervalo de data requerido.
select date '2011-12-31 + row_number() over() as datax
from information_schema.tables t
where id < ((365 * 4)+1)
Estas datas são geradas zeradas para somar as datas existentes , se a data existir na série não é alterada pois se soma zero, se não existir aparece como 0.
Esse select que você citou que cria a série "fajuta", seria para eu tentar trazer NULL nesta última SQL que passei?
Quase isto , trazer todas as datas da série com valores zerados , com o UNION e um SUM , todas as datas sairiam no sql.
Uma forma de fazer , veja outras ideais aqui.
>
Quase isto , trazer todas as datas da série com valores zerados , com o UNION e um SUM , todas as datas sairiam no sql.
Uma forma de fazer , veja outras ideais aqui.
Motta eu dei uma lida nas ideias que você me indicou mas não enxerguei uma saída, seria mais viável eu criar outro tópico somente com esta última Sql que criei e solicitar ajuda para trazer NULL nos dias da data de hoje em diante?
Talvez não , a questão é que não sei a síntaxe exta do PG e não tenho instalado para testar
mas tente :
Fazer a sql de "data fajuta" funcionar gerando datas e após isto tentar o UNION
Digo que está técnica funciona pois já fiz diversas vezes em Oracle.
Motta 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;
http://forum.imasters.com.br/topic/531156-consulta-sql/
Veja se ajuda, a partir do #4