none
JOIN entre tabelas com SUM e COUNT RRS feed

  • Pergunta

  • Tenho as seguintes tabelas:

    Tabela campanha:

    Tabela questao:

    Tabela voucher:

    Estou tentando retornar a seguinte estrutura:

    id_campanha ds_nome dt_inicio dt_final qt_voucher voucher_ativo voucher_desativado qt_quetoes
    31 O que você acha do refeitório 09/11/2021 10/11/2021 0 0 0 6
    30 Você está feliz em seu serviço 08/11/2021 09/11/2021 0 0 0 5
    29 Campanha nome exemplo 04/11/2021 08/11/2021 10 9 1 4

    Montei a seguinte query de select:

    SELECT DISTINCT
        
        a.id_campanha,    
        a.ds_nome,    
        a.dt_local,    
        a.user_sistema,    
        a.dt_inicio,    
        a.dt_final,    
        a.ativa,    
        b.qt_voucher,
        
    SUM(case when b.ativo = 1 then 1 else 0 end) over(partition by b.id_campanha) as voucher_ativo,    
    SUM(case when b.ativo = 0 then 1 else 0 end) over(partition by b.id_campanha) as voucher_desativado,
    
    count(c.id_campanha) over(partition by a.id_campanha) as qt_questoes    
    
    FROM campanha a    
    left join voucher b on a.id_campanha = b.id_campanha     
    left join questao c on a.id_campanha = c.id_campanha    
    ORDER BY a.id_campanha

    Mas meu retorno está assim:

    Não consigo uma somatório dos vouchers ativos e desativados correta com a função:

    SUM(case when b.ativo = 1 then 1 else 0 end) over(partition by b.id_campanha) as voucher_ativo,
    SUM(case when b.ativo = 0 then 1 else 0 end) over(partition by b.id_campanha) as voucher_desativado,

    E contagem das questões por campanha com a função:

    count(c.id_campanha) over(partition by a.id_campanha) as qt_questoes

    O que está errado? Se alguém tiver outra lógica para montar esse select, por favor poderia me ajudar.

    quinta-feira, 4 de novembro de 2021 17:12

Respostas

  • Acho que para resolver esse problema é necessário somar primeiro para depois fazer os Joins.

    Segue uma sugestão para testes utilizando o operador Apply para retornar as somas relativas a tabela Voucher (já que nesse caso são várias colunas) e uma subquery para a soma relativa a tabela Questao:

    SELECT  
        a.id_campanha,    
        a.ds_nome,    
        a.dt_local,    
        a.user_sistema,    
        a.dt_inicio,    
        a.dt_final,    
        a.ativa,    
    
        o.qt_voucher,
        o.voucher_ativo,    
        o.voucher_desativado,
    
        (select count(c.id_campanha) from questao c 
         where a.id_campanha = c.id_campanha) as qt_questoes
    
    FROM campanha a
    outer apply
    (
        select
            MAX(b.qt_voucher) as qt_voucher,  
            SUM(case when b.ativo = 1 then 1 else 0 end) as voucher_ativo,    
            SUM(case when b.ativo = 0 then 1 else 0 end) as voucher_desativado
        from voucher b 
        where a.id_campanha = b.id_campanha
    ) as o
     
    ORDER BY a.id_campanha
    

    obs: não sei qual vai ser o critério para a coluna qt_voucher, no exemplo acima utilizei a função Max para retornar o maior valor

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    quinta-feira, 4 de novembro de 2021 18:24

Todas as Respostas

  • Boa tarde,

    Você quer que a consulta retorne apenas uma linha para cada campanha?

    Se sim, qual valor deve ser retornado para a coluna qt_voucher se ela tiver valores diferentes para a mesma campanha?


    Assinatura: http://www.imoveisemexposicao.com.br

    quinta-feira, 4 de novembro de 2021 17:54
  • Acho que para resolver esse problema é necessário somar primeiro para depois fazer os Joins.

    Segue uma sugestão para testes utilizando o operador Apply para retornar as somas relativas a tabela Voucher (já que nesse caso são várias colunas) e uma subquery para a soma relativa a tabela Questao:

    SELECT  
        a.id_campanha,    
        a.ds_nome,    
        a.dt_local,    
        a.user_sistema,    
        a.dt_inicio,    
        a.dt_final,    
        a.ativa,    
    
        o.qt_voucher,
        o.voucher_ativo,    
        o.voucher_desativado,
    
        (select count(c.id_campanha) from questao c 
         where a.id_campanha = c.id_campanha) as qt_questoes
    
    FROM campanha a
    outer apply
    (
        select
            MAX(b.qt_voucher) as qt_voucher,  
            SUM(case when b.ativo = 1 then 1 else 0 end) as voucher_ativo,    
            SUM(case when b.ativo = 0 then 1 else 0 end) as voucher_desativado
        from voucher b 
        where a.id_campanha = b.id_campanha
    ) as o
     
    ORDER BY a.id_campanha
    

    obs: não sei qual vai ser o critério para a coluna qt_voucher, no exemplo acima utilizei a função Max para retornar o maior valor

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    quinta-feira, 4 de novembro de 2021 18:24
  • Boa tarde,

    Você quer que a consulta retorne apenas uma linha para cada campanha?

    Se sim, qual valor deve ser retornado para a coluna qt_voucher se ela tiver valores diferentes para a mesma campanha?


    Assinatura: http://www.imoveisemexposicao.com.br

    Sim, uma linha por campanha.

    Cada campanha é única com id_campanha 


    quinta-feira, 4 de novembro de 2021 18:24
  • Evandro,

    Você tentou realizar o agrupamento dos dados tendo com base o exemplo de código compartilhado pelo Gapimex?

    Se possível faça uso da cláusula Group By.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sexta-feira, 5 de novembro de 2021 22:32
  • Olá , 

     

    Obrigado por confirmar que foi encontrada uma solução para a consulta feita. 

      

    Obrigado por usar os fóruns do MSDN. 

      

    Yerelin Contreras 

     ______________________ 

      

    Lembre-se de "Marcar como uma resposta" as respostas que resolveram seu problema. É uma forma comum de agradecer àqueles que ajudaram e torna mais fácil para outros visitantes encontrarem a solução posteriormente. 

      

    Se você tiver quaisquer elogios ou reclamações sobre o suporte do MSDN, sinta-se à vontade para entrar em contato com MSDNFSF@microsoft.com. 

    sexta-feira, 26 de novembro de 2021 23:19