View com BETWEEN DATAS agrupada, é possível?

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
Avatar do usuário
Porva
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 342
Registrado em: Seg, 29 Jan 2007 7:36 am
Localização: São Paulo/SP
Rafael S. Nunes
São Paulo/SP

galera, bom dia

como não é possível criar views com parâmetros, eu preciso criar uma View e utilizar um BETWEEN de datas nela, mas eu não posso exibir a data na cláusula Select, pois este campo faz parte do agrupamento e se eu exibí-lo, o agrupamento abre por data, é possível solucionar esse problema?

serei mais específico, eu tenho um Form que tem 2 parâmetros de datas (inicial e final), e listarei os registros num bloco tabular alimentado por essa view agrupada e obedecendo os parâmetros

um exemplo simples do que preciso:

Selecionar tudo

CREATE VIEW produtos_v AS
  SELECT produto
        ,descricao
        --Não exibirei a data_compra pois este campo faz parte do agrupamento
    FROM produtos
   GROUP BY produto
           ,descricao
           ,data_compra;
Eu precisaria usar conforme abaixo, mas como não tenho o campo DATA_COMPRA na cláusula Select, então não se torna possível:

Selecionar tudo

SELECT * 
  FROM produtos_v 
 WHERE data_compra BETWEEN TO_DATE('01/01/2012','DD/MM/YYYY')
                       AND TO_DATE('31/12/2012','DD/MM/YYYY');

é possível solucionar esse problema sem precisar criar uma procedure alimentando uma tabela temporária?!
Avatar do usuário
Marciel
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 158
Registrado em: Qui, 03 Mai 2007 10:12 am
Localização: Vitória - ES
Sabe qual o cúmulo da ignorância, da apatia e da ira?
Não sei, não quero saber e tenho raiva de quem sabe.

Rapaz... se você adiciona a data no group by, sua query já irá abrir por data.

Talvez seja melhor criar a view com os campos que precisa, sem group by, e agrupar na query que utiliza a view.
Avatar do usuário
Porva
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 342
Registrado em: Seg, 29 Jan 2007 7:36 am
Localização: São Paulo/SP
Rafael S. Nunes
São Paulo/SP

isso Marciel, eu me equivoquei no exemplo

o correto é agrupar apenas por produto e descrição, mas podendo usar o filtro de datas

eu fiz algo parecido, fiz uma view aberta, e um cursor buscando essa view e agrupando, conforme abaixo:

repare que dessa forma eu consigo usar o BETWEEN, mas preciso popular uma tabela temporária pra depois exibir as informações no Form conforme minha necessidade, eu queria fazer isso mais diretamente, sem precisar usar desse artifício

Selecionar tudo

    --
    -- Agrupamento externo para permitir a utilização dos parametros
    -- PC_DATA_INICIAL e PC_DATA_FINAL na view internamente
    --
    CURSOR c_transb(pc_data_inicial     DATE
                   ,pc_data_final       DATE
                   ,pc_org_id           NUMBER
                   ,pc_transbordo       NUMBER
                   ,pc_terminal         NUMBER
                   ,pc_cliente_final_id NUMBER) IS
      SELECT slc_agrup.cliente_final_id
            ,slc_agrup.cliente_final_desc
            ,slc_agrup.org_id              
            ,slc_agrup.transbordo
            ,slc_agrup.transbordo_desc 
            ,slc_agrup.terminal
            ,slc_agrup.terminal_desc
            ,slc_agrup.porto
            ,slc_agrup.porto_desc
            ,SUM(slc_agrup.qtd_carregada_nf) qtd_carregada_nf
            ,SUM(slc_agrup.transito1)        transito1
            ,SUM(slc_agrup.est_terceiro)     est_terceiro
            ,SUM(slc_agrup.transito2)        transito2
            ,SUM(slc_agrup.vlr_porto)        vlr_porto
       FROM (SELECT xotv.cliente_final_id
                   ,xotv.cliente_final_desc
                   ,xotv.org_id
                   ,xotv.trx_date
                   ,xotv.transbordo
                   ,xotv.transbordo_desc 
                   ,xotv.terminal
                   ,xotv.terminal_desc
                   ,xotv.porto
                   ,xotv.porto_desc
                   ,xotv.qtd_carregada_nf
                   ,xotv.transito1
                   ,xotv.est_terceiro
                   ,xotv.transito2
                   ,xotv.vlr_porto
               FROM apps.xx_om_transbordo_v xotv
              WHERE xotv.org_id          = pc_org_id
                AND xotv.trx_date        BETWEEN pc_data_inicial AND pc_data_final
                AND (pc_transbordo       IS NULL OR xotv.transbordo = pc_transbordo)
                AND (pc_terminal         IS NULL OR xotv.terminal   = pc_terminal)
                AND (pc_cliente_final_id IS NULL OR xotv.cliente_final_id = pc_cliente_final_id)) slc_agrup
       GROUP BY slc_agrup.cliente_final_id
               ,slc_agrup.cliente_final_desc
               ,slc_agrup.org_id              
               ,slc_agrup.transbordo
               ,slc_agrup.transbordo_desc 
               ,slc_agrup.terminal
               ,slc_agrup.terminal_desc
               ,slc_agrup.porto
               ,slc_agrup.porto_desc;
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 15 visitantes