Usuário com melhor resposta
Max, Min e Avg em agrupamentos

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
Respostas
-
Boa Tarde,
Seria isso ?
Code SnippetCREATE
TABLE #tblTeste (Qtde
INT,Item
INT,Data
SMALLDATETIME,Preco
SMALLMONEY)SET
DATEFORMAT DMYINSERT
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
#tblTesteGROUP
BY Data[ ]s,
Gustavo
-
Olá José,
Então vamos a segunda tentativa
Code SnippetCREATE
TABLE #tblTeste (Qtde
Item
INT,Data
SMALLDATETIME,Preco
SMALLMONEY)SET
DATEFORMAT DMYINSERT
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
FROM
#tblTesteGROUP
BY DataORDER
BY 2 DESC-- Usando sintaxe ANSI (Maior Preço)
SELECT
TOP 1 Data,MAX
FROM
#tblTesteGROUP
BY DataHAVING
MAX(Preco * Qtde) >= ALL (SELECT MAX(Preco * Qtde) FROM #tblTeste)-- Usando sintaxe TSQL (Menor Preço)
SELECT
TOP 1 Data,MIN
FROM
#tblTesteGROUP
BY DataORDER
BY 2 ASC-- Usando sintaxe ANSI (Menor Preço)
SELECT
TOP 1 Data,MIN
(Preco * Qtde) AS MaiorPrecoFROM
#tblTesteGROUP
BY DataHAVING
MIN(Preco * Qtde) <= ALL (SELECT MIN(Preco * Qtde) FROM #tblTeste)-- Cálculo da média do período
SELECT
AVG(Preco * Qtde) FROM #tblTesteDROP
TABLE #tblTeste[ ]s,
Gustavo
Todas as Respostas
-
Boa Tarde,
Seria isso ?
Code SnippetCREATE
TABLE #tblTeste (Qtde
INT,Item
INT,Data
SMALLDATETIME,Preco
SMALLMONEY)SET
DATEFORMAT DMYINSERT
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
#tblTesteGROUP
BY Data[ ]s,
Gustavo
-
-
Olá José,
Então vamos a segunda tentativa
Code SnippetCREATE
TABLE #tblTeste (Qtde
Item
INT,Data
SMALLDATETIME,Preco
SMALLMONEY)SET
DATEFORMAT DMYINSERT
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
FROM
#tblTesteGROUP
BY DataORDER
BY 2 DESC-- Usando sintaxe ANSI (Maior Preço)
SELECT
TOP 1 Data,MAX
FROM
#tblTesteGROUP
BY DataHAVING
MAX(Preco * Qtde) >= ALL (SELECT MAX(Preco * Qtde) FROM #tblTeste)-- Usando sintaxe TSQL (Menor Preço)
SELECT
TOP 1 Data,MIN
FROM
#tblTesteGROUP
BY DataORDER
BY 2 ASC-- Usando sintaxe ANSI (Menor Preço)
SELECT
TOP 1 Data,MIN
(Preco * Qtde) AS MaiorPrecoFROM
#tblTesteGROUP
BY DataHAVING
MIN(Preco * Qtde) <= ALL (SELECT MIN(Preco * Qtde) FROM #tblTeste)-- Cálculo da média do período
SELECT
AVG(Preco * Qtde) FROM #tblTesteDROP
TABLE #tblTeste[ ]s,
Gustavo
-
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!!!!
-
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