none
Duvida em Media de uma consulta SQL RRS feed

  • 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,7

    PS: Aprendendo SQL a 1 mês na marra, desculpem de antemão minha ignorância.

    Muito Obrigado.

    quinta-feira, 6 de dezembro de 2018 18:51

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

    quinta-feira, 6 de dezembro de 2018 19:35

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

    quinta-feira, 6 de dezembro de 2018 19:35
  • 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

    quinta-feira, 6 de dezembro de 2018 22:30
  • 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!

    quinta-feira, 6 de dezembro de 2018 22:43
  • Deleted
    sexta-feira, 7 de dezembro de 2018 22:16
  • Muito Obrigado!

    Tudo certo!

    quarta-feira, 12 de dezembro de 2018 13:30