none
Somar com subquery RRS feed

  • Pergunta

  • Bom dia, amigos.

    Eu duas tabelas com os mesmos campos em cada uma. Uma delas, conterá apenas uma linha a cada ano, e a outra será alimentada semanalmente. O que eu preciso fazer é uma query que multiplique o valor de cada campo da tabela semanal (Performance) sempre pela mesma linha da tabela anual (Pontuacao).

    A solução que eu achei, eu tenho quase certeza que não é a melhor, porém, foi a única que consegui obter o resultado esperado. 

    Poderiam me dizer se existe um jeito melhor de realizar a query abaixo?

    Obrigado

    DECLARE @rodada int = 1
    DECLARE @liga int = 1
    
    DECLARE @JogosSemSofrerGol int = (SELECT TOP(1) p.JogosSemSofrerGol FROM Pontuacao p)
    DECLARE @DefesaPenalti int = (SELECT TOP(1) p.DefesaPenalti FROM Pontuacao p)
    DECLARE @DefesaDificil int = (SELECT TOP(1) p.DefesaDificil FROM Pontuacao p)
    DECLARE @RoubadaDeBola int = (SELECT TOP(1) p.RoubadaDeBola FROM Pontuacao p)
    
    select SUM(
    (p.JogosSemSofrerGol * @JogosSemSofrerGol) +
    (p.DefesaPenalti * @DefesaPenalti) +
    (p.DefesaDificil * @DefesaDificil) + 
    (p.RoubadaDeBola * @RoubadaDeBola)
    ) AS Pontos, 
    
    j.Nome + ' ' + j.Sobrenome AS Jogador,
    t.NomeTime AS Time,
    r.Rodada,
    r.Temporada
     from elencos e
    join rodadas r on e.RodadaID = r.RodadaID
    join performances p on r.RodadaID = p.RodadaID
    join jogadores j on e.JogadorID = j.JogadorID
    join times t on e.TimeID = t.TimeID
    join proprietarios pr on t.ProprietarioID = pr.ProprietarioID
    join Ligas l on pr.LigaID = l.LigaID
    where rodada = @rodada and l.LigaID = @liga
    Group by j.Nome, j.Sobrenome, t.NomeTime, r.Rodada, r.Temporada


    Leonardo D'Amato


    quinta-feira, 19 de maio de 2016 13:37

Respostas

  • Leonardo,

    Porque você acha que não é a melhor?

    Você realmente precisa passar os valores para suas variáveis?

    Talvez uma possibilidade fosse utilizar uma CTE?

    A sua tabela pontuação não possui relação com as outras tabelas? Nesta tabela pontuação existe o Id do time?


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]



    quinta-feira, 19 de maio de 2016 14:19

Todas as Respostas

  • Leonardo,

    Porque você acha que não é a melhor?

    Você realmente precisa passar os valores para suas variáveis?

    Talvez uma possibilidade fosse utilizar uma CTE?

    A sua tabela pontuação não possui relação com as outras tabelas? Nesta tabela pontuação existe o Id do time?


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]



    quinta-feira, 19 de maio de 2016 14:19
  • Bom dia, Junior. 

    Fiz também com CTE agora. Ambas funcionaram. Existe alguma forma, entre as duas, que seja mais performática?

    Obrigado e um abraço


    Leonardo D'Amato

    sexta-feira, 20 de maio de 2016 11:53
  • Leonardo,

    Neste caso, você terá que analisar através do plano de execução o processamento de cada uma delas.


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    terça-feira, 24 de maio de 2016 13:30