Ir para conteúdo
Fórum Script Brasil

Kakao

Membros
  • Total de itens

    463
  • Registro em

  • Última visita

Posts postados por Kakao

  1. Luis, eu só vi agora que você editou a última pergunta. Então fica assim:

    create or replace function compare_vendas(
        range_1 daterange,
        range_2 daterange
    ) returns table(
        nome text, codpro text,
        quant_range_1 bigint, valor_range_1 numeric,
        quant_range_2 bigint, valor_range_2 numeric
    ) as $$
    
        select
            p.nome, p.codpro,
            sum(v.pecas * (v.data <@ range_1)::int),
            sum(v.valortotal * (v.data <@ range_1)::int),
            sum(v.pecas * (v.data <@ range_2)::int),
            sum(v.valortotal * (v.data <@ range_2)::int)
        from
            public.fato_vendas_franquias v
            inner join
            public.dim_produto p on p.sk_codpro = v.sk_codpro
        where
            v.data <@ range_1 or
            v.data <@ range_2
        group by p.nome, p.codpro
        order by p.codpro asc;
    
    $$ language sql;
    
    Estou supondo que fato_vendas_franquias.data seja to tipo date. O tipo daterange com suas funções facilita este tipo de comparação.

    Se for construir a chamada manualmente é mais fácil fazer o cast

    select *
    from compare_vendas(
        '[2013-05-01, 2013-05-15]'::daterange,
        '[2014-05-01, 2014-05-15]'::daterange
    );
    
    Se for passar os parâmetros pelo cliente é melhor usar o construtor

    select *
    from compare_vendas(
        daterange('2013-05-01'::date, '2013-05-15'::date, '[]'),
        daterange('2014-05-01'::date, '2014-05-15'::date, '[]')
    );
    
  2. Aí tem que ser função:

    create or replace function compare_vendas(ano_1 int, ano_2 int)
    returns table(
        nome text, codpro text,
        quant_ano_1 bigint, valor_ano_1 numeric,
        quant_ano_2 bigint, valor_ano_2 numeric
    ) as $$
    
        select
            p.nome, p.codpro,
            sum(v.pecas * (extract(year from v.data) = ano_1)::int),
            sum(v.valortotal * (extract(year from v.data) = ano_1)::int),
            sum(v.pecas * (extract(year from v.data) = ano_2)::int),
            sum(v.valortotal * (extract(year from v.data) = ano_2)::int)
        from
            public.fato_vendas_franquias v
            inner join
            public.dim_produto p on p.sk_codpro = v.sk_codpro
        where
            v.data >= ano_1::text || '-01-01' and
            v.data < (ano_2 + 1)::text || '-01-01'
        group by p.nome, p.codpro
        order by p.codpro asc;
    
    $$ language sql;
    
    Se necessário substitua os tipos das colunas retornadas pela função pelos tipos adequados.

    Para chamar:

    select *
    from compare_vendas(2014, 2015);
    
  3. select
        p.nome,
        sum(v.pecas * (extract(year from v.data) = 2014)::int) as quant2014,
        sum(v.valortotal * (extract(year from v.data) = 2014)::int) as valor2014,
        sum(v.pecas * (extract(year from v.data) = 2015)::int) as quant2015,
        sum(v.valortotal * (extract(year from v.data) = 2015)::int) as valor2015
    from
        public.fato_vendas_franquias v
        inner join
        public.dim_produto p on p.sk_codpro = v.sk_codpro
    where v.data >= '2014-01-01' and v.data < '2016-01-01'
    
  4. create or replace function ibge_dv(codigo char(6))
    returns char(1) as $$
    
        select ((10 - resto) * (resto != 0)::int)::char(1)
        from (
            select
                (
                    a135 +
                    left(a2, 1)::int + right(a2, 1)::int + 
                    left(a4, 1)::int + right(a4, 1)::int + 
                    left(a6, 1)::int + right(a6, 1)::int
                ) % 10 as resto
            from (
                select
                    a[1] + a[3] + a[5] as a135,
                    to_char(a[2] * 2, 'FM09') as a2,
                    to_char(a[4] * 2, 'FM09') as a4,
                    to_char(a[6] * 2, 'FM09') as a6
                from (
                    select string_to_array(codigo, null)::integer[] as a
                ) s
            ) s
        ) s
        ;
    
    $$ language sql;
    
    select ibge_dv('355030');
     ibge_dv 
    ---------
     8
    
  5. Parece que é mais ou menos isso:

    select
        q.agent,
        q.queuename as queuename,
        rm.nome as Agent,
        count(event like '%ABANDON%' or null) as perdida,
        count(event like '%COMPLETE%' or null) as atendida,
        count(event = 'TRANSFER' or null) as transferida,
    from
        queue_log q  
        inner join
        f_ramal_virtual rm on rm.ramal_virtual = q.agent  
    where
        q.event != 'RINGNOANSWER' 
        and
        (${prmnomefila} is null or q.queuename = ${prmnomefila})
        and
        array[
            time::date = current_date - 1,
            time::date = current_date - 7,
            time::date = current_date - 30,
            time::date between ${prmdatainicial} and ${prmdatafinal}
        ][${prmintervalo}]
    group by 1, 2, 3
  6. No order by você está comparando só o nome:

    levenshtein(upper(nome), upper('1721333100PSF - Programa de Saúde da Família'))
    
    Para evitar este tipo de erro use o posicionamento da coluna no order by:

    with naturezareceitasiga(id, codigo, nome) as (
        values (1, '1721333100PSF', 'Programa de Saúde da Família')
    )
    select
        levenshtein(upper(nrs.codigo || nrs.nome), upper('1721333100PSF - Programa de Saúde da Família')) as ctrl,
        coalesce(nrs.id,0) as id,
        nrs.nome,
        upper(nrs.codigo || nrs.nome) as nomeNatRecSiga
    from naturezareceitasiga nrs
    order by 1
    ;
     ctrl | id |             nome             |              nomenatrecsiga               
    ------+----+------------------------------+-------------------------------------------
        3 |  1 | Programa de Saúde da Família | 1721333100PSFPROGRAMA DE SAÚDE DA FAMÍLIA
    
  7. 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
    
  8. 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?
  9. 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
    
×
×
  • Criar Novo...