none
Soma de linhas/colunas RRS feed

  • Pergunta

  • Boa noite, estou tentando fazer uma soma e inserir essas somas em outras  colunas, porém, na mesma tabela,.

    SELECT 

    COALESCE ( c.idcurso,0) AS idcurso,
    COALESCE (c.idies,0) AS idies,
    COALESCE(c.idlocal,0) AS idlocal,
    COALESCE(c.idbolsa,0) AS idbolsa,
    COALESCE(c.idnota,0) AS idnota,
    COALESCE(codigotempo,0) as ano,

    c.mensalidade,
    c.nota_integral_cotas,
    c.nota_integral_ampla,
    c.nota_parcial_cotas,
    c.nota_parcial_ampla,
    c.bolsa_integral_cotas,
    c.bolsa_integral_ampla,
    c.bolsa_parcial_ampla,
    c.bolsa_parcial_cotas,

     SUM(bolsa_integral_ampla) as qtdIntegralAmpla,
    SUM(bolsa_integral_cotas)  as qtdIntegralcotas,
    SUM(bolsa_parcial_ampla) as qtdParcialAmpla,
    SUM(bolsa_parcial_cotas) as qtdParcialCotas

    FROM cursosprounine c 

    inner join curso a on a.idcurso = c.idcurso
    inner join ies i on i.idies = c.idies
    inner join local l on l.idlocal = c.idlocal
    inner join bolsa b on b.idbolsa = c.idbolsa
    inner join nota n on n.idnota = c.idnota;

    No preview só roda 1 linha justamente com a soma.

    Mas eu precisarei da tabela assim: 

    Alguém ajuda? rs

    quarta-feira, 13 de novembro de 2019 22:02

Todas as Respostas

  • Igor,

    Talvez seja mais fácil você dividir este Select em dois aplicando o conceito de CTE, no qual a primeira CTE apresenta todas as colunas e a segunda CTE somente as colunas que necessitam ser calculadas:

    ;With CTE_Completa
    As
    (
    SELECT 
    
    COALESCE ( c.idcurso,0) AS idcurso,
    COALESCE (c.idies,0) AS idies,
    COALESCE(c.idlocal,0) AS idlocal,
    COALESCE(c.idbolsa,0) AS idbolsa,
    COALESCE(c.idnota,0) AS idnota,
    COALESCE(codigotempo,0) as ano,
    
    c.mensalidade,
    c.nota_integral_cotas,
    c.nota_integral_ampla,
    c.nota_parcial_cotas,
    c.nota_parcial_ampla,
    c.bolsa_integral_cotas,
    c.bolsa_integral_ampla,
    c.bolsa_parcial_ampla,
    c.bolsa_parcial_cotas,
    
    FROM cursosprounine c 
    inner join curso a on a.idcurso = c.idcurso
    inner join ies i on i.idies = c.idies
    inner join local l on l.idlocal = c.idlocal
    inner join bolsa b on b.idbolsa = c.idbolsa
    inner join nota n on n.idnota = c.idnota
    ),
    CTE_Somas
    As
    (Select C.IdCurso,
     SUM(bolsa_integral_ampla) as qtdIntegralAmpla,
     SUM(bolsa_integral_cotas)  as qtdIntegralcotas,
     SUM(bolsa_parcial_ampla) as qtdParcialAmpla,
     SUM(bolsa_parcial_cotas) as qtdParcialCotas
    
    FROM cursosprounine c 
    inner join curso a on a.idcurso = c.idcurso
    inner join ies i on i.idies = c.idies
    inner join local l on l.idlocal = c.idlocal
    inner join bolsa b on b.idbolsa = c.idbolsa
    inner join nota n on n.idnota = c.idnota
    Group By C.ID_Curso ) Select CC.*, CS.* From CTE_Completa Inner Join CTE_Somas On CC.Id_Curso = CS.ID_Curso
    Este é somente um exemplo, não testei, acredito que possa conter erros.



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


    quarta-feira, 13 de novembro de 2019 22:38
  • Igor, o resultado de uma consulta exibe sempre o mesmo número de colunas para todas as linhas. Não há como exibir algumas colunas somente para a primeira linha, exceto através de uma formatação específica. O usual é repetir as colunas de totalização em todas as linhas ou então obter uma totalização ao final para cada coluna que deve ser totalizada.

    Qual é a versão do SQL Server?

    De qual tabela é a coluna codigotempo?

    As colunas que identificam cada linha são c.idcurso, c.idies, c.idlocal, c.idbolsa, c.idnota e codigotempo?

    Tenho a impressão de que algumas das tabelas não são necessárias para obter o resultado do exemplo.

    ---

    Para o primeiro caso a estrutura do código é a seguinte:

    -- código #1
    SELECT colunas, 
           sum (bolsa_integral_ampla) over() as qtdIntegralAmpla,
           sum (bolsa_integral_cotas) over() as qtdIntegralcotas,
           sum (bolsa_parcial_ampla) over() as qtdParcialAmpla,
           sum (bolsa_parcial_cotas) over() as qtdParcialCotas
       from ...;

     

    Para o segundo caso é necessário conhecer quais colunas identificam cada linha de forma única. A estrutura é a seguinte:

    -- código #2
    SELECT colunas que identificam a linha,
    max (coluna que não identifica a linha) as nome coluna, ...
           max (outra coluna que não identifica a linha) as outra coluna,
           sum (bolsa_integral_ampla) as bolsa_integral_ampla,
           sum (bolsa_integral_cotas) as bolsa_integral_cotas,
           sum (bolsa_parcial_ampla) as bolsa_parcial_ampla,
           sum (bolsa_parcial_cotas) as bolsa_parcial_cotas from ... group by grouping sets ((colunas que identificam a linha), ());
     

    Lembre-se de marcar esta resposta se ela te ajudou a resolver o problema


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz quinta-feira, 14 de novembro de 2019 12:54
    • Sugerido como Resposta José Diz quinta-feira, 21 de novembro de 2019 10:34
    quarta-feira, 13 de novembro de 2019 23:36
  • Para o caso 1, o código SQL ficaria assim:

    -- código #1 v2
    SELECT COALESCE ( c.idcurso,0) AS idcurso,
           COALESCE (c.idies,0) AS idies,
           COALESCE (c.idlocal,0) AS idlocal,
           COALESCE (c.idbolsa,0) AS idbolsa,
           COALESCE (c.idnota,0) AS idnota,
           COALESCE (codigotempo,0) as ano,
    
           c.mensalidade,
           c.nota_integral_cotas,
           c.nota_integral_ampla,
           c.nota_parcial_cotas,
           c.nota_parcial_ampla,
           c.bolsa_integral_cotas,
           c.bolsa_integral_ampla,
           c.bolsa_parcial_ampla,
           c.bolsa_parcial_cotas,
    
           sum (bolsa_integral_ampla) over() as qtdIntegralAmpla,
           sum (bolsa_integral_cotas) over() as qtdIntegralcotas,
           sum (bolsa_parcial_ampla) over() as qtdParcialAmpla,
           sum (bolsa_parcial_cotas) over() as qtdParcialCotas
    FROM cursosprounine c inner join curso a on a.idcurso = c.idcurso inner join ies i on i.idies = c.idies inner join local l on l.idlocal = c.idlocal inner join bolsa b on b.idbolsa = c.idbolsa inner join nota n on n.idnota = c.idnota;

    Requer versão 2012 ou mais recente do SQL Server.


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    quinta-feira, 14 de novembro de 2019 11:09