Как отладить «синтаксическую ошибку в или около CAST» в функции postgresql - PullRequest
0 голосов
/ 04 апреля 2019



Я пытаюсь исправить проблему с функцией PostgreSQL, которая создает (или заменяет) «представление» всякий раз, когда мое веб-приложение обновляется новой информацией, предоставленной пользователем.

Сначала я подумал, что пропущена запятая, и изменил запятую с ', 4)' на '.valor, 0) как числовой) , ', но это кажется, скорее всего, проблема конкатенации, но я не могу ее понять.

Вот область кода в функции PostgreSQL:

CASE
    WHEN string_agg(i_v.operador, ' '::text ORDER BY i_v.id_indicador, i_v.ordem) ~~ '%/%'::text THEN (' case when '::text || string_agg(
    CASE
        WHEN i_v_ant.operador = '/'::text THEN COALESCE(('cast(coalesce(v'::text || v.id_variavel) || '.valor,0) as numeric) '::text, ''::text)
        ELSE ''::text
    END, ' '::text ORDER BY i_v.id_indicador, i_v.ordem)) || ' = 0 then 0 else '::text
    ELSE ''::text
END) || 'round('::text) || string_agg((COALESCE(i_v.aninhamento, ''::text) || COALESCE(('cast(coalesce(v'::text || v.id_variavel) || '.valor,0) as numeric) '::text, ''::text)) || COALESCE(i_v.operador, ''::text), ' '::text ORDER BY i_v.id_indicador, i_v.ordem)) || ',4) '::text) ||

CASE [...]

Исходное сообщение об ошибке имеет указатель "^" на приведении, поэтому я выделил его жирным шрифтом там, где должна быть точка.

ОШИБКА: синтаксическая ошибка в или около \ "cast \" \ nLINE 7: ... m (round (cast (coalesce (v326.valor, 0) в виде числа)) c ast (coale. ..

Полная ошибка (пришла с \ r \ n \ t и т. Д., Поэтому я заменил ее для упрощения визуализации):

QUERY:  insert into sistema.indicador_calculo (id_indicador,data,id_regiao,dimensao,id_territorio,valor)    select 350 as id_indicador
,cast(date_trunc( 'year', coalesce(cast(v326.data as date),cast(v326.data as date))) as date) as data
,coalesce(cast(v326.id_regiao as numeric),cast(v326.id_regiao as numeric)) as id_regiao
,coalesce(cast(v326.dimensao as text),cast(v326.dimensao as text)) as dimensao
,8 as id_territorio
, sum( round(cast(coalesce(v326.valor,0) as numeric)  cast(coalesce(v326.valor,0) as numeric) ,4)  ) as valor 


Любая помощь, которую вы могли бы оказать, будет высоко ценится!

РЕДАКТИРОВАТЬ: вот весь оператор CREATE OR REPLACE:


CREATE OR REPLACE VIEW sistema.query_indicador AS 
 SELECT COALESCE(comp.id_indicador_pai, query_indicador.id_indicador) AS id_indicador,
    query_indicador.id_territorio,
    'insert into sistema.indicador_calculo (id_indicador,data,id_regiao,dimensao,id_territorio,valor) '::text ||
        CASE
            WHEN comp.id_indicador_pai IS NOT NULL THEN (((((' select '::text || comp.id_indicador_pai) || ',data,id_regiao,'::text) || COALESCE((''''::text || comp.dimensao) || ''''::text, 'dimensao'::text)) || ' ,id_territorio,valor from ('::text) || query_indicador.query) || ') query_indicador '::text
            ELSE query_indicador.query
        END AS query
   FROM sistema.indicador_composicao comp
     FULL JOIN ( SELECT i_v.id_indicador,
                CASE
                    WHEN col.cont_terr = 0 AND NOT c_ant.id_territorio IS NULL OR i_v.id_variavel IS NULL THEN c_ant.id_territorio
                    ELSE c.id_territorio
                END AS id_territorio,
            ((((((((((((((((((((((((((((((((((((((((('  select'::text || '
'::text) || i_v.id_indicador) || ' as id_indicador'::text) || '
'::text) || ','::text) || 'cast(date_trunc( ' ||
            CASE
                WHEN indic.periodicidade = 'mensal'::text THEN '''month'''::text
                WHEN indic.periodicidade = 'anual'::text THEN '''year'''::text
                WHEN indic.periodicidade = 'trimestral'::text THEN '''quarter'''::text
                ELSE ''::text
            END || ', coalesce('::text) || string_agg(('cast(v'::text || v.id_variavel) || '.data as date)'::text, ','::text ORDER BY i_v.id_indicador, i_v.ordem)) || ')) as date) as data'::text) || '
'::text) || ','::text) || 'coalesce('::text) || string_agg(('cast(v'::text || v.id_variavel) || '.id_regiao as numeric)'::text, ','::text ORDER BY i_v.id_indicador, i_v.ordem)) || ') as id_regiao'::text) || '
'::text) || ','::text) || 'coalesce('::text) || string_agg(('cast(v'::text || v.id_variavel) || '.dimensao as text)'::text, ','::text ORDER BY i_v.id_indicador, i_v.ordem)) || ') as dimensao'::text) || '
'::text) || ','::text) ||
                CASE
                    WHEN col.cont_terr = 0 AND NOT c_ant.id_territorio IS NULL OR i_v.id_variavel IS NULL THEN c_ant.id_territorio
                    ELSE c.id_territorio
                END) || ' as id_territorio'::text) || '
'::text) || ','::text) ||
                ' sum( ' ||
                CASE
                    WHEN string_agg(i_v.operador, ' '::text ORDER BY i_v.id_indicador, i_v.ordem) ~~ '%/%'::text THEN (' case when '::text || string_agg(
                    CASE
                        WHEN i_v_ant.operador = '/'::text THEN COALESCE(('cast(coalesce(v'::text || v.id_variavel) || '.valor,0) as numeric) '::text, ''::text)
                        ELSE ''::text
                    END, ' '::text ORDER BY i_v.id_indicador, i_v.ordem)) || ' = 0 then 0 else '::text
                    ELSE ''::text
                END) || 'round('::text) || string_agg((COALESCE(i_v.aninhamento, ''::text) || COALESCE(('cast(coalesce(v'::text || v.id_variavel) || '.valor,0) as numeric) '::text, ''::text)) || COALESCE(i_v.operador, ''::text), ' '::text ORDER BY i_v.id_indicador, i_v.ordem)) || ',4) '::text) ||
                CASE
                    WHEN string_agg(i_v.operador, ' '::text ORDER BY i_v.id_indicador, i_v.ordem) ~~ '%/%'::text THEN ' end '::text
                    ELSE ''::text
                END) || ' ) as valor '::text) || '
'::text) || ' from '::text) || '
'::text) || string_agg(((((
                CASE
                    WHEN i_v.rank > 1 AND NOT (v.coluna_data IS NULL AND v.coluna_dimensao IS NULL AND v.distribuicao = true) THEN (('
'::text || v.tipo_cruzamento) || ' join '::text) || '
'::text
                    WHEN v.coluna_data IS NULL AND v.coluna_dimensao IS NULL AND v.distribuicao = true THEN ' cross join '::text
                    ELSE ''::text
                END || '('::text) || c.query) || ') v'::text) ||
                CASE
                    WHEN i_v.rank_variavel > 1 THEN NULL::integer
                    ELSE v.id_variavel
                END) ||
                CASE
                    WHEN i_v.rank > 1 AND NOT (v.coluna_data IS NULL AND v.coluna_dimensao IS NULL AND v.distribuicao = true) THEN ((((('
'::text || ' on '::text) ||
                    CASE
                        WHEN v.distribuicao = false THEN (((('v'::text || v_ant.id_variavel) || '.id_regiao = '::text) || 'v'::text) || v.id_variavel) || '.id_regiao '::text
                        ELSE ''::text
                    END) ||
                    CASE
                        WHEN v.distribuicao = false AND v.coluna_data IS NOT NULL AND v_ant.coluna_data IS NOT NULL THEN ' and '::text
                        ELSE ''::text
                    END) ||
                    CASE
                        WHEN v.coluna_data IS NOT NULL AND v_ant.coluna_data IS NOT NULL THEN (((('v'::text || v_ant.id_variavel) || '.data = '::text) || 'v'::text) || v.id_variavel) || '.data '::text
                        ELSE ''::text
                    END) ||
                    CASE
                        WHEN (v.distribuicao = false OR v.coluna_data IS NOT NULL AND v_ant.coluna_data IS NOT NULL) AND v.coluna_dimensao IS NOT NULL AND NOT ((v.desabilitar_dim_raiz = true OR v.desabilitar_dim_raiz = true) AND c.id_territorio = sistema.territorio_raiz(c.id_territorio)) THEN ' and '::text
                        ELSE ''::text
                    END) ||
                    CASE
                        WHEN v.coluna_dimensao IS NOT NULL AND NOT ((v.desabilitar_dim_raiz = true OR v.desabilitar_dim_raiz = true) AND c.id_territorio = sistema.territorio_raiz(c.id_territorio)) THEN (((('v'::text || v_ant.id_variavel) || '.dimensao = '::text) || 'v'::text) || v.id_variavel) || '.dimensao '::text
                        ELSE ''::text
                    END
                    ELSE ''::text
                END, ''::text ORDER BY i_v.id_indicador, i_v.rank)) || '
'::text) || ' group by
        coalesce('::text || string_agg(('cast(v'::text  || v.id_variavel) || '.id_regiao as numeric)'::text, ','::text ORDER BY i_v.id_indicador, i_v.ordem) || ')
         ,cast(date_trunc( ' ||
            CASE
                WHEN indic.periodicidade = 'mensal'::text THEN '''month'''::text
                WHEN indic.periodicidade = 'anual'::text THEN '''year'''::text
                WHEN indic.periodicidade = 'trimestral'::text THEN '''quarter'''::text
                ELSE ''::text
            END || ',coalesce('::text || string_agg(('cast(v'::text || v.id_variavel) || '.data as date)'::text, ','::text ORDER BY i_v.id_indicador, i_v.ordem) || ')) as date)
        ,coalesce('::text || string_agg(('cast(v'::text || v.id_variavel) || '.dimensao as text)'::text, ','::text ORDER BY i_v.id_indicador, i_v.ordem) || ')
        order by '::text) || '
'::text) || ' id_regiao'::text) || '
'::text) || ' ,data'::text) || '
'::text) || ' ,dimensao'::text AS query
           FROM ( SELECT rank() OVER (PARTITION BY indicador_x_variavel.id_indicador ORDER BY indicador_x_variavel.ordem) AS rank,
                    rank() OVER (PARTITION BY indicador_x_variavel.id_indicador, indicador_x_variavel.id_variavel ORDER BY indicador_x_variavel.ordem) AS rank_variavel,
                    indicador_x_variavel.id_indicador,
                    indicador_x_variavel.id_variavel,
                    indicador_x_variavel.operador,
                    indicador_x_variavel.ordem,
                    indicador_x_variavel.aninhamento
                   FROM sistema.indicador_x_variavel) i_v
             INNER JOIN sistema.indicador indic
                ON indic.id_indicador = i_v.id_indicador
             LEFT JOIN sistema.query_variavel c ON c.id_variavel = i_v.id_variavel
             LEFT JOIN sistema.variavel v ON v.id_variavel = i_v.id_variavel
             LEFT JOIN ( SELECT rank() OVER (PARTITION BY indicador_x_variavel.id_indicador ORDER BY indicador_x_variavel.ordem) AS rank,
                    indicador_x_variavel.id_indicador,
                    indicador_x_variavel.id_variavel,
                    indicador_x_variavel.operador,
                    indicador_x_variavel.ordem,
                    indicador_x_variavel.aninhamento
                   FROM sistema.indicador_x_variavel) i_v_ant ON i_v_ant.id_indicador = i_v.id_indicador AND i_v.rank = (i_v_ant.rank + 1)
             LEFT JOIN sistema.variavel v_ant ON v_ant.id_variavel = i_v_ant.id_variavel
             LEFT JOIN ( SELECT COALESCE(coluna.id_fonte_dados, f.id_fonte_dados) AS id_fonte_dados,
                    count(coluna.id_territorio) AS cont_terr
                   FROM sistema.coluna
                     FULL JOIN sistema.fonte_dados f ON f.id_fonte_dados = coluna.id_fonte_dados
                  GROUP BY (COALESCE(coluna.id_fonte_dados, f.id_fonte_dados))) col ON v.id_fonte_dados = col.id_fonte_dados
             LEFT JOIN sistema.query_variavel c_ant ON c_ant.id_variavel = v_ant.id_variavel AND (col.cont_terr = 0 OR i_v.id_variavel IS NULL)
          GROUP BY i_v.id_indicador, indic.periodicidade, (
                CASE
                    WHEN col.cont_terr = 0 AND NOT c_ant.id_territorio IS NULL OR i_v.id_variavel IS NULL THEN c_ant.id_territorio
                    ELSE c.id_territorio
                END)
          ORDER BY i_v.id_indicador) query_indicador ON query_indicador.id_indicador = comp.id_indicador_filho;

Вот соответствующий вид SQL:

-- View: sistema.query_indicador

-- DROP VIEW sistema.query_indicador;

CREATE OR REPLACE VIEW sistema.query_indicador AS
 SELECT COALESCE(comp.id_indicador_pai, query_indicador.id_indicador) AS id_indicador,
    query_indicador.id_territorio,
    'insert into sistema.indicador_calculo (id_indicador,data,id_regiao,dimensao,id_territorio,valor) '::text ||
        CASE
            WHEN comp.id_indicador_pai IS NOT NULL THEN (((((' select '::text || comp.id_indicador_pai) || ',data,id_regiao,'::text) || COALESCE((''''::text || comp.dimensao) || ''''::text, 'dimensao'::text)) || ' ,id_territorio,valor from ('::text) || query_indicador.query) || ') query_indicador '::text
            ELSE query_indicador.query
        END AS query
   FROM sistema.indicador_composicao comp
     FULL JOIN ( SELECT i_v.id_indicador,
                CASE
                    WHEN col.cont_terr = 0 AND NOT c_ant.id_territorio IS NULL OR i_v.id_variavel IS NULL THEN c_ant.id_territorio
                    ELSE c.id_territorio
                END AS id_territorio,
            (((((((((((((((((((((((((((((((((((((((((((((((((((('   select'::text || '
'::text) || i_v.id_indicador) || ' as id_indicador'::text) || '
'::text) || ','::text) || 'cast(date_trunc( '::text) ||
                CASE
                    WHEN indic.periodicidade = 'mensal'::text THEN '''month'''::text
                    WHEN indic.periodicidade = 'anual'::text THEN '''year'''::text
                    WHEN indic.periodicidade = 'trimestral'::text THEN '''quarter'''::text
                    ELSE ''::text
                END) || ', coalesce('::text) || string_agg(('cast(v'::text || v.id_variavel) || '.data as date)'::text, ','::text ORDER BY i_v.id_indicador, i_v.ordem)) || ')) as date) as data'::text) || '
'::text) || ','::text) || 'coalesce('::text) || string_agg(('cast(v'::text || v.id_variavel) || '.id_regiao as numeric)'::text, ','::text ORDER BY i_v.id_indicador, i_v.ordem)) || ') as id_regiao'::text) || '
'::text) || ','::text) || 'coalesce('::text) || string_agg(('cast(v'::text || v.id_variavel) || '.dimensao as text)'::text, ','::text ORDER BY i_v.id_indicador, i_v.ordem)) || ') as dimensao'::text) || '
'::text) || ','::text) ||
                CASE
                    WHEN col.cont_terr = 0 AND NOT c_ant.id_territorio IS NULL OR i_v.id_variavel IS NULL THEN c_ant.id_territorio
                    ELSE c.id_territorio
                END) || ' as id_territorio'::text) || '
'::text) || ','::text) || ' sum( '::text) ||
                CASE
                    WHEN string_agg(i_v.operador, ' '::text ORDER BY i_v.id_indicador, i_v.ordem) ~~ '%/%'::text THEN (' case when '::text || string_agg(
                    CASE
                        WHEN i_v_ant.operador = '/'::text THEN COALESCE(('cast(coalesce(v'::text || v.id_variavel) || '.valor,0) as numeric) '::text, ''::text)
                        ELSE ''::text
                    END, ' '::text ORDER BY i_v.id_indicador, i_v.ordem)) || ' = 0 then 0 else '::text
                    ELSE ''::text
                END) || 'round('::text) || string_agg((COALESCE(i_v.aninhamento, ''::text) || COALESCE(('+ cast(coalesce(v'::text || v.id_variavel) || '.valor,0) as numeric) '::text, ''::text)) || COALESCE(i_v.operador, ''::text), ' '::text ORDER BY i_v.id_indicador, i_v.ordem)) || ',4) '::text) ||
                CASE
                    WHEN string_agg(i_v.operador, ' '::text ORDER BY i_v.id_indicador, i_v.ordem) ~~ '%/%'::text THEN ' end '::text
                    ELSE ''::text
                END) || ' ) as valor '::text) || '
'::text) || ' from '::text) || '
'::text) || string_agg(((((
                CASE
                    WHEN i_v.rank > 1 AND NOT (v.coluna_data IS NULL AND v.coluna_dimensao IS NULL AND v.distribuicao = true) THEN (('
'::text || v.tipo_cruzamento) || ' join '::text) || '
'::text
                    WHEN v.coluna_data IS NULL AND v.coluna_dimensao IS NULL AND v.distribuicao = true THEN ' cross join '::text
                    ELSE ''::text
                END || '('::text) || c.query) || ') v'::text) ||
                CASE
                    WHEN i_v.rank_variavel > 1 THEN NULL::integer
                    ELSE v.id_variavel
                END) ||
                CASE
                    WHEN i_v.rank > 1 AND NOT (v.coluna_data IS NULL AND v.coluna_dimensao IS NULL AND v.distribuicao = true) THEN ((((('
'::text || ' on '::text) ||
                    CASE
                        WHEN v.distribuicao = false THEN (((('v'::text || v_ant.id_variavel) || '.id_regiao = '::text) || 'v'::text) || v.id_variavel) || '.id_regiao '::text
                        ELSE ''::text
                    END) ||
                    CASE
                        WHEN v.distribuicao = false AND v.coluna_data IS NOT NULL AND v_ant.coluna_data IS NOT NULL THEN ' and '::text
                        ELSE ''::text
                    END) ||
                    CASE
                        WHEN v.coluna_data IS NOT NULL AND v_ant.coluna_data IS NOT NULL THEN (((('v'::text || v_ant.id_variavel) || '.data = '::text) || 'v'::text) || v.id_variavel) || '.data '::text
                        ELSE ''::text
                    END) ||
                    CASE
                        WHEN (v.distribuicao = false OR v.coluna_data IS NOT NULL AND v_ant.coluna_data IS NOT NULL) AND v.coluna_dimensao IS NOT NULL AND NOT ((v.desabilitar_dim_raiz = true OR v.desabilitar_dim_raiz = true) AND c.id_territorio = sistema.territorio_raiz(c.id_territorio)) THEN ' and '::text
                        ELSE ''::text
                    END) ||
                    CASE
                        WHEN v.coluna_dimensao IS NOT NULL AND NOT ((v.desabilitar_dim_raiz = true OR v.desabilitar_dim_raiz = true) AND c.id_territorio = sistema.territorio_raiz(c.id_territorio)) THEN (((('v'::text || v_ant.id_variavel) || '.dimensao = '::text) || 'v'::text) || v.id_variavel) || '.dimensao '::text
                        ELSE ''::text
                    END
                    ELSE ''::text
                END, ''::text ORDER BY i_v.id_indicador, i_v.rank)) || '
'::text) || ' group by
        coalesce('::text) || string_agg(('cast(v'::text || v.id_variavel) || '.id_regiao as numeric)'::text, ','::text ORDER BY i_v.id_indicador, i_v.ordem)) || ')
         ,cast(date_trunc( '::text) ||
                CASE
                    WHEN indic.periodicidade = 'mensal'::text THEN '''month'''::text
                    WHEN indic.periodicidade = 'anual'::text THEN '''year'''::text
                    WHEN indic.periodicidade = 'trimestral'::text THEN '''quarter'''::text
                    ELSE ''::text
                END) || ',coalesce('::text) || string_agg(('cast(v'::text || v.id_variavel) || '.data as date)'::text, ','::text ORDER BY i_v.id_indicador, i_v.ordem)) || ')) as date)
        ,coalesce('::text) || string_agg(('cast(v'::text || v.id_variavel) || '.dimensao as text)'::text, ','::text ORDER BY i_v.id_indicador, i_v.ordem)) || ')
        order by '::text) || '
'::text) || ' id_regiao'::text) || '
'::text) || ' ,data'::text) || '
'::text) || ' ,dimensao'::text AS query
           FROM ( SELECT rank() OVER (PARTITION BY indicador_x_variavel.id_indicador ORDER BY indicador_x_variavel.ordem) AS rank,
                    rank() OVER (PARTITION BY indicador_x_variavel.id_indicador, indicador_x_variavel.id_variavel ORDER BY indicador_x_variavel.ordem) AS rank_variavel,
                    indicador_x_variavel.id_indicador,
                    indicador_x_variavel.id_variavel,
                    indicador_x_variavel.operador,
                    indicador_x_variavel.ordem,
                    indicador_x_variavel.aninhamento
                   FROM sistema.indicador_x_variavel) i_v
             JOIN sistema.indicador indic ON indic.id_indicador = i_v.id_indicador
             LEFT JOIN sistema.query_variavel c ON c.id_variavel = i_v.id_variavel
             LEFT JOIN sistema.variavel v ON v.id_variavel = i_v.id_variavel
             LEFT JOIN ( SELECT rank() OVER (PARTITION BY indicador_x_variavel.id_indicador ORDER BY indicador_x_variavel.ordem) AS rank,
                    indicador_x_variavel.id_indicador,
                    indicador_x_variavel.id_variavel,
                    indicador_x_variavel.operador,
                    indicador_x_variavel.ordem,
                    indicador_x_variavel.aninhamento
                   FROM sistema.indicador_x_variavel) i_v_ant ON i_v_ant.id_indicador = i_v.id_indicador AND i_v.rank = (i_v_ant.rank + 1)
             LEFT JOIN sistema.variavel v_ant ON v_ant.id_variavel = i_v_ant.id_variavel
             LEFT JOIN ( SELECT COALESCE(coluna.id_fonte_dados, f.id_fonte_dados) AS id_fonte_dados,
                    count(coluna.id_territorio) AS cont_terr
                   FROM sistema.coluna
                     FULL JOIN sistema.fonte_dados f ON f.id_fonte_dados = coluna.id_fonte_dados
                  GROUP BY (COALESCE(coluna.id_fonte_dados, f.id_fonte_dados))) col ON v.id_fonte_dados = col.id_fonte_dados
             LEFT JOIN sistema.query_variavel c_ant ON c_ant.id_variavel = v_ant.id_variavel AND (col.cont_terr = 0 OR i_v.id_variavel IS NULL)
          GROUP BY i_v.id_indicador, indic.periodicidade, (
                CASE
                    WHEN col.cont_terr = 0 AND NOT c_ant.id_territorio IS NULL OR i_v.id_variavel IS NULL THEN c_ant.id_territorio
                    ELSE c.id_territorio
                END)
          ORDER BY i_v.id_indicador) query_indicador ON query_indicador.id_indicador = comp.id_indicador_filho;

ALTER TABLE sistema.query_indicador
    OWNER TO postgres;

... и пример строки (в ней 3 столбца):

COLUMN(type): VALUE
-------------------
id_indicador(integer): 326
id_territorio(integer): 7
query(text): "insert into sistema.indicador_calculo (id_indicador,data,id_regiao,dimensao,id_territorio,valor)  select
326 as id_indicador
,cast(date_trunc( 'year', coalesce(cast(v298.data as date),cast(v299.data as date))) as date) as data
,coalesce(cast(v298.id_regiao as numeric),cast(v299.id_regiao as numeric)) as id_regiao
,coalesce(cast(v298.dimensao as text),cast(v299.dimensao as text)) as dimensao
,7 as id_territorio
, sum(  case when  cast(coalesce(v299.valor,0) as numeric)  = 0 then 0 else round(+ cast(coalesce(v298.valor,0) as numeric) / + cast(coalesce(v299.valor,0) as numeric) ,4)  end  ) as valor 
 from 
(select 
cast(date_trunc('year',ano) as date) as data 
,id_ou as id_regiao 
,trim(both ' ' from funcao_gov) as dimensao,298 as id_variavel 
,7 as id_territorio
,sum(cast(replace(valor_gasto,',','.') as numeric)) as valor
from fonte_dados.ouc_gasto_funcao f

group by id_ou
        ,cast(date_trunc('year',ano) as date)
        ,trim(both ' ' from funcao_gov)
order by id_ou
        ,cast(date_trunc('year',ano) as date)
        ,trim(both ' ' from funcao_gov)) v298
inner join 
(select 
cast(date_trunc('year',ano) as date) as data 
, cast(null as numeric)  as id_regiao 
,null as dimensao,299 as id_variavel 
,4 as id_territorio
,sum(cast(replace(valor_gasto,',','.') as numeric)) as valor
from fonte_dados.ouc_gasto_funcao f

group by  cast(null as numeric) 
        ,cast(date_trunc('year',ano) as date)
        , dimensao 
order by  cast(null as numeric) 
        ,cast(date_trunc('year',ano) as date)
        , dimensao ) v299
 on v298.data = v299.data 
 group by
        coalesce(cast(v298.id_regiao as numeric),cast(v299.id_regiao as numeric))
         ,cast(date_trunc( 'year',coalesce(cast(v298.data as date),cast(v299.data as date))) as date)
        ,coalesce(cast(v298.dimensao as text),cast(v299.dimensao as text))
        order by 
 id_regiao
 ,data
 ,dimensao"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...