none
Max, Min e Avg em agrupamentos RRS feed

  • Pergunta

  • Boa tarde,
    o que preciso e não consigo de forma alguma fazer é o seguinte:
    Tenho uma tabela assim:

    Qtde    Item    Data              Preço
    10        1        01/01/2001    10,00
    15        2        01/01/2001    11,00
    15        1        02/01/2001    18,00
    17        2        02/01/2001    19,00
    19        1        03/01/2001    15,00
    02        2        03/01/2001    17,00

    Preciso saber em qual data o resultado (preço * item) foi o maior, em qual data foi o menor e qual a média (por data).
    Ou seja, preciso dos seguintes resultados (utilizando o exemplo acima)

    Maximo
    Data             Preço
    02/01/2001    593,00

    Mínimo
    Data             Preço
    01/01/2001    265,00

    Média
    //Soma do total de cada dia, dividido pela quantidade de dias
    1177,00

    Já tentei utilizando o avg, max e min, mas parece que eles não funcionam quando eu preciso utilizá-los junto com o sum (ao menos eu não estou conseguindo).

    Alguém pode me ajudar?

    []'s a todos
    quinta-feira, 6 de março de 2008 19:45

Respostas

  • Boa Tarde,

     

    Seria isso ?

     

    Code Snippet

    CREATE TABLE #tblTeste (

    Qtde INT,

    Item INT,

    Data SMALLDATETIME,

    Preco SMALLMONEY)

     

    SET DATEFORMAT DMY

     

    INSERT INTO #tblTeste VALUES (10,1,'01/01/2001',10.00)

    INSERT INTO #tblTeste VALUES (15,2,'01/01/2001',11.00)

    INSERT INTO #tblTeste VALUES (15,1,'02/01/2001',18.00)

    INSERT INTO #tblTeste VALUES (17,2,'02/01/2001',19.00)

    INSERT INTO #tblTeste VALUES (19,1,'03/01/2001',15.00)

    INSERT INTO #tblTeste VALUES (02,2,'03/01/2001',17.00)

     

    SELECT Data, MAX(Preco * Qtde), MIN(Preco * Qtde), AVG(Preco * Qtde)

    FROM #tblTeste

    GROUP BY Data

     

     

    [ ]s,

     

    Gustavo

     

    quinta-feira, 6 de março de 2008 20:52
  • Olá José,

     

    Então vamos a segunda tentativa

     

    Code Snippet

    CREATE TABLE #tblTeste (

    Qtde INT,

    Item INT,

    Data SMALLDATETIME,

    Preco SMALLMONEY)

     

    SET DATEFORMAT DMY

     

    INSERT INTO #tblTeste VALUES (10,1,'01/01/2001',10.00)

    INSERT INTO #tblTeste VALUES (15,2,'01/01/2001',11.00)

    INSERT INTO #tblTeste VALUES (15,1,'02/01/2001',18.00)

    INSERT INTO #tblTeste VALUES (17,2,'02/01/2001',19.00)

    INSERT INTO #tblTeste VALUES (19,1,'03/01/2001',15.00)

    INSERT INTO #tblTeste VALUES (02,2,'03/01/2001',17.00)

     

    -- Usando sintaxe TSQL (Maior Preço)

    SELECT TOP 1 Data,

    MAX(Preco * Qtde) AS MaiorPreco

    FROM #tblTeste

    GROUP BY Data

    ORDER BY 2 DESC

     

    -- Usando sintaxe ANSI (Maior Preço)

    SELECT TOP 1 Data,

    MAX(Preco * Qtde) AS MaiorPreco

    FROM #tblTeste

    GROUP BY Data

    HAVING MAX(Preco * Qtde) >= ALL (SELECT MAX(Preco * Qtde) FROM #tblTeste)

     

    -- Usando sintaxe TSQL (Menor Preço)

    SELECT TOP 1 Data,

    MIN(Preco * Qtde) AS MaiorPreco

    FROM #tblTeste

    GROUP BY Data

    ORDER BY 2 ASC

     

    -- Usando sintaxe ANSI (Menor Preço)

    SELECT TOP 1 Data,

    MIN(Preco * Qtde) AS MaiorPreco

    FROM #tblTeste

    GROUP BY Data

    HAVING MIN(Preco * Qtde) <= ALL (SELECT MIN(Preco * Qtde) FROM #tblTeste)

     

    -- Cálculo da média do período

    SELECT AVG(Preco * Qtde) FROM #tblTeste

     

    DROP TABLE #tblTeste

     

     

    [ ]s,

     

    Gustavo

    sexta-feira, 7 de março de 2008 12:25

Todas as Respostas

  • Boa Tarde,

     

    Seria isso ?

     

    Code Snippet

    CREATE TABLE #tblTeste (

    Qtde INT,

    Item INT,

    Data SMALLDATETIME,

    Preco SMALLMONEY)

     

    SET DATEFORMAT DMY

     

    INSERT INTO #tblTeste VALUES (10,1,'01/01/2001',10.00)

    INSERT INTO #tblTeste VALUES (15,2,'01/01/2001',11.00)

    INSERT INTO #tblTeste VALUES (15,1,'02/01/2001',18.00)

    INSERT INTO #tblTeste VALUES (17,2,'02/01/2001',19.00)

    INSERT INTO #tblTeste VALUES (19,1,'03/01/2001',15.00)

    INSERT INTO #tblTeste VALUES (02,2,'03/01/2001',17.00)

     

    SELECT Data, MAX(Preco * Qtde), MIN(Preco * Qtde), AVG(Preco * Qtde)

    FROM #tblTeste

    GROUP BY Data

     

     

    [ ]s,

     

    Gustavo

     

    quinta-feira, 6 de março de 2008 20:52
  • Na verdade não, eu não devo ter explicado direito.
    Não preciso do "max", "min" e "avg" de cada dia e sim saber qual o dia que o max(preco * qtde) foi o maior, o dia que o min(preco * qtde) foi o menor e o avg do período inteiro.

    Valeu!
    sexta-feira, 7 de março de 2008 02:42
  • Olá José,

     

    Então vamos a segunda tentativa

     

    Code Snippet

    CREATE TABLE #tblTeste (

    Qtde INT,

    Item INT,

    Data SMALLDATETIME,

    Preco SMALLMONEY)

     

    SET DATEFORMAT DMY

     

    INSERT INTO #tblTeste VALUES (10,1,'01/01/2001',10.00)

    INSERT INTO #tblTeste VALUES (15,2,'01/01/2001',11.00)

    INSERT INTO #tblTeste VALUES (15,1,'02/01/2001',18.00)

    INSERT INTO #tblTeste VALUES (17,2,'02/01/2001',19.00)

    INSERT INTO #tblTeste VALUES (19,1,'03/01/2001',15.00)

    INSERT INTO #tblTeste VALUES (02,2,'03/01/2001',17.00)

     

    -- Usando sintaxe TSQL (Maior Preço)

    SELECT TOP 1 Data,

    MAX(Preco * Qtde) AS MaiorPreco

    FROM #tblTeste

    GROUP BY Data

    ORDER BY 2 DESC

     

    -- Usando sintaxe ANSI (Maior Preço)

    SELECT TOP 1 Data,

    MAX(Preco * Qtde) AS MaiorPreco

    FROM #tblTeste

    GROUP BY Data

    HAVING MAX(Preco * Qtde) >= ALL (SELECT MAX(Preco * Qtde) FROM #tblTeste)

     

    -- Usando sintaxe TSQL (Menor Preço)

    SELECT TOP 1 Data,

    MIN(Preco * Qtde) AS MaiorPreco

    FROM #tblTeste

    GROUP BY Data

    ORDER BY 2 ASC

     

    -- Usando sintaxe ANSI (Menor Preço)

    SELECT TOP 1 Data,

    MIN(Preco * Qtde) AS MaiorPreco

    FROM #tblTeste

    GROUP BY Data

    HAVING MIN(Preco * Qtde) <= ALL (SELECT MIN(Preco * Qtde) FROM #tblTeste)

     

    -- Cálculo da média do período

    SELECT AVG(Preco * Qtde) FROM #tblTeste

     

    DROP TABLE #tblTeste

     

     

    [ ]s,

     

    Gustavo

    sexta-feira, 7 de março de 2008 12:25
  • A única coisa que eu precisei fazer foi:

    SELECT TOP 1 Data, MAX(Preco * Qtde) AS MaiorPreco


    para


    SELECT TOP 1 Data, SUM(Preco * Qtde) AS MaiorPreco


    Porque eu precisava do total do dia, somando todos os dias e não de cada item em si!

    Muito obrigado, serviu direitinho para o que eu precisava!

    Valeu!!!!

    sexta-feira, 7 de março de 2008 18:54
  • Acabei de ver que para o minimo e maximo funcionou, mas não para o avg.
    Porque do jeito que você pos, ele pega a média dos itens, não a média dos dias (na qual deveriam ser somados os itens dia a dia).

    Deveria ser algo como avg(sum(preco * qtde)) group by data

    []'s
    sexta-feira, 7 de março de 2008 19:09