Usuário com melhor resposta
Duvida em Media de uma consulta SQL

Pergunta
-
Boa tarde, Estou com problemas para criar uma media geral de um campo de SQL....
Tenho no banco de dados a data de emissão e de faturamento de cada pedido de venda da fabrica, aqui sempre faturamos no dia em que a mercadoria fica pronta para viajar, então a diferença entre essas duas datas é um indicador importante. preciso que a consulta me retorne a média desse prazo dos últimos 10 pedidos. Ja consegui trazer todos esses prazos separados cada um em uma linha, porém preciso em uma unica linha a média desses 10 números que ele esta me trazendo... Segue a consulta:
SELECT TOP 10 DATEDIFF ( day , C5_EMISSAO , C6_DATFAT ) PRAZO FROM SC6010 WITH(NOLOCK) INNER JOIN SC5010 WITH(NOLOCK) ON C5_FILIAL= C6_FILIAL AND C5_NUM = C6_NUM INNER JOIN SE4010 WITH(NOLOCK) ON C5_CONDPAG = E4_CODIGO AND SE4010.D_E_L_E_T_ = ' ' INNER JOIN SA1010 WITH(NOLOCK) ON C5_CLIENTE = A1_COD AND C5_LOJACLI = A1_LOJA INNER JOIN SA3010 WITH(NOLOCK) ON A3_COD = C5_VEND1 INNER JOIN SB1010 WITH(NOLOCK) ON C6_PRODUTO = B1_COD LEFT JOIN SBM010 WITH(NOLOCK) ON B1_GRUPO = BM_GRUPO AND SBM010.D_E_L_E_T_ = ' ' LEFT JOIN SF4010 WITH(NOLOCK) ON C6_TES = F4_CODIGO AND SF4010.D_E_L_E_T_ = ' ' AND C6_FILIAL = F4_FILIAL JOIN AOV010 AOV WITH(NOLOCK) ON AOV.AOV_CODSEG = A1_CODSEG and AOV.D_E_L_E_T_ = ' ' WHERE SC6010.D_E_L_E_T_ = ' ' AND SC5010.D_E_L_E_T_ = ' ' AND SA1010.D_E_L_E_T_ = ' ' AND SB1010.D_E_L_E_T_ = ' ' and SA3010.D_E_L_E_T_ = ' ' AND MONTH(SC5010.C5_EMISSAO) >= MONTH(DATEADD(MONTH,-1,GETDATE())) AND YEAR(SC5010.C5_EMISSAO) >= YEAR(DATEADD(MONTH,-1,GETDATE())) GROUP BY (DATEDIFF(day, C5_EMISSAO, C6_DATFAT)), C6_DATFAT, C5_EMISSAO, C6_NUM ORDER BY (C6_DATFAT) DESC
O Resultado que estou tendo é:
PRAZO
0
1
1
3
5
5
5
5
6
6
Porém eu preciso da média desses 10 números em uma unica linha resumida.
Ou seja, (resultado esperado para os dados acima descritos):
PRAZO
3,7PS: Aprendendo SQL a 1 mês na marra, desculpem de antemão minha ignorância.
Muito Obrigado.
Respostas
-
Sua consulta está correta, para tirar a média basta realizar a soma do campo e dividir pela quantidade de linhas.
Ficaria mais ou menos assim:
SELECT SUM(PRAZO)/COUNT(*) FROM ( SELECT TOP 10 DATEDIFF ( day , C5_EMISSAO , C6_DATFAT ) PRAZO FROM SC6010 WITH(NOLOCK) INNER JOIN SC5010 WITH(NOLOCK) ON C5_FILIAL= C6_FILIAL AND C5_NUM = C6_NUM INNER JOIN SE4010 WITH(NOLOCK) ON C5_CONDPAG = E4_CODIGO AND SE4010.D_E_L_E_T_ = ' ' INNER JOIN SA1010 WITH(NOLOCK) ON C5_CLIENTE = A1_COD AND C5_LOJACLI = A1_LOJA INNER JOIN SA3010 WITH(NOLOCK) ON A3_COD = C5_VEND1 INNER JOIN SB1010 WITH(NOLOCK) ON C6_PRODUTO = B1_COD LEFT JOIN SBM010 WITH(NOLOCK) ON B1_GRUPO = BM_GRUPO AND SBM010.D_E_L_E_T_ = ' ' LEFT JOIN SF4010 WITH(NOLOCK) ON C6_TES = F4_CODIGO AND SF4010.D_E_L_E_T_ = ' ' AND C6_FILIAL = F4_FILIAL JOIN AOV010 AOV WITH(NOLOCK) ON AOV.AOV_CODSEG = A1_CODSEG and AOV.D_E_L_E_T_ = ' ' WHERE SC6010.D_E_L_E_T_ = ' ' AND SC5010.D_E_L_E_T_ = ' ' AND SA1010.D_E_L_E_T_ = ' ' AND SB1010.D_E_L_E_T_ = ' ' and SA3010.D_E_L_E_T_ = ' ' AND MONTH(SC5010.C5_EMISSAO) >= MONTH(DATEADD(MONTH,-1,GETDATE())) AND YEAR(SC5010.C5_EMISSAO) >= YEAR(DATEADD(MONTH,-1,GETDATE())) GROUP BY (DATEDIFF(day, C5_EMISSAO, C6_DATFAT)), C6_DATFAT, C5_EMISSAO, C6_NUM) AS Q
"A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski
- Sugerido como Resposta Junior Galvão - MVPMVP quinta-feira, 6 de dezembro de 2018 21:58
- Marcado como Resposta Diegoamferreira quinta-feira, 6 de dezembro de 2018 23:26
Todas as Respostas
-
Sua consulta está correta, para tirar a média basta realizar a soma do campo e dividir pela quantidade de linhas.
Ficaria mais ou menos assim:
SELECT SUM(PRAZO)/COUNT(*) FROM ( SELECT TOP 10 DATEDIFF ( day , C5_EMISSAO , C6_DATFAT ) PRAZO FROM SC6010 WITH(NOLOCK) INNER JOIN SC5010 WITH(NOLOCK) ON C5_FILIAL= C6_FILIAL AND C5_NUM = C6_NUM INNER JOIN SE4010 WITH(NOLOCK) ON C5_CONDPAG = E4_CODIGO AND SE4010.D_E_L_E_T_ = ' ' INNER JOIN SA1010 WITH(NOLOCK) ON C5_CLIENTE = A1_COD AND C5_LOJACLI = A1_LOJA INNER JOIN SA3010 WITH(NOLOCK) ON A3_COD = C5_VEND1 INNER JOIN SB1010 WITH(NOLOCK) ON C6_PRODUTO = B1_COD LEFT JOIN SBM010 WITH(NOLOCK) ON B1_GRUPO = BM_GRUPO AND SBM010.D_E_L_E_T_ = ' ' LEFT JOIN SF4010 WITH(NOLOCK) ON C6_TES = F4_CODIGO AND SF4010.D_E_L_E_T_ = ' ' AND C6_FILIAL = F4_FILIAL JOIN AOV010 AOV WITH(NOLOCK) ON AOV.AOV_CODSEG = A1_CODSEG and AOV.D_E_L_E_T_ = ' ' WHERE SC6010.D_E_L_E_T_ = ' ' AND SC5010.D_E_L_E_T_ = ' ' AND SA1010.D_E_L_E_T_ = ' ' AND SB1010.D_E_L_E_T_ = ' ' and SA3010.D_E_L_E_T_ = ' ' AND MONTH(SC5010.C5_EMISSAO) >= MONTH(DATEADD(MONTH,-1,GETDATE())) AND YEAR(SC5010.C5_EMISSAO) >= YEAR(DATEADD(MONTH,-1,GETDATE())) GROUP BY (DATEDIFF(day, C5_EMISSAO, C6_DATFAT)), C6_DATFAT, C5_EMISSAO, C6_NUM) AS Q
"A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski
- Sugerido como Resposta Junior Galvão - MVPMVP quinta-feira, 6 de dezembro de 2018 21:58
- Marcado como Resposta Diegoamferreira quinta-feira, 6 de dezembro de 2018 23:26
-
Certo, ele trouxe só uma linha, porém com esse seu codigo não esta trazendo os ultimos 10 pedidos, o que estava fazendo ele trazer os ultimos 10 era a linha:
ORDER BY (C6_DATFAT) DESC
E no codigo que você mandou esta sem ela... tentei colocar no mesmo lugar que estava antes e me retorna um erro :(
Poderia me mostrar como ficaria para fazer exatamente isso porém com os 10 ultimos pedidos faturados (C6_DATFAT)
Obrigado
-
Na verdade consegui agora, coloquei o order antes do ) final... muito obrigado amigo!
Só uma ultima duvida, esta retornando o número inteiro, 2 como resultado da média de:
PRAZO
1
1
2
2
2
3
3
6
6
0
Preciso que retorne com uma casa decimal
O resultado ideal seria: 2,6
Obrigado!
-
-