none
Duvida Somatório RRS feed

  • Pergunta

  • Pessoal, Boa Tarde!

    Tenho essa consulta abaixo que está correta, mas quando vou usar o "unio all" para fazer os somatórios dos campos, ela não me retorna a quantidade de clientes corretamente, pois dou um count(distinct cliente), todos repedidos fica sem contar.

    Alguém sabe como resolver a situação?

    SELECT  A3_NREDUZ, Z16_CAT, 
    SUM(Z16_QTNAT) Z16_QTNAT,
    CASE WHEN SUM(Z16_QTNAT)  = 0 THEN 0 ELSE SUM(Z16_PMNAT) / CASE WHEN SUM(Z16_QTNAT) < 0 AND  SUM(Z16_QTNAT) < 0 THEN SUM(Z16_QTNAT)  * -1  ELSE SUM(Z16_QTNAT) END  END AS Z16_PMNAT, 
    SUM(Z16_QTENAT) Z16_QTENAT, 
    CASE WHEN SUM(Z16_QTENAT) = 0 THEN 0 ELSE SUM(Z16_PMEMB) / CASE WHEN SUM(Z16_QTENAT) < 0 AND SUM(Z16_QTENAT) < 0 THEN SUM(Z16_QTENAT) * -1   ELSE SUM(Z16_QTENAT) END  END AS Z16_PMEMB, 
    SUM (Z16_QTLIQ) Z16_QTLIQ, CASE WHEN SUM (Z16_QTLIQ) = 0 THEN 0 ELSE SUM(Z16_PMLIQ) / SUM(Z16_QTLIQ)  END AS Z16_PMLIQ,
    SUM(DCMDCO) AS DCMDCO,SUM(QTDEV) QTDEV,SUM(QTBONI) QTBONI,SUM(QTREP) QTREP,SUM(QTDBAGEM) QTDBAGEM,SUM(VLRDB) VLRDB, ISNULL(COUNT(DISTINCT CLIENTE), 0) CLIENTE
    FROM (
    SELECT     Z16_FILIAL, UPPER(A3_NREDUZ) A3_NREDUZ, X5_DESCRI, Z16_CAT, Z16_FRETE, Z16_UF, 
    Z16_QTNAT  - (ISNULL(CASE WHEN TIPOVO IN ('G','P','E') THEN Z16_QTDEV END,0)) Z16_QTNAT, 
    (Z16_QTNAT * Z16_PMNAT) - ((ISNULL(CASE WHEN TIPOVO IN ('G','P','E') THEN VALOR_CV END,0))) Z16_PMNAT,  
    Z16_QTENAT - ISNULL(CASE WHEN TIPOVO IN ('P','E') THEN Z16_QTDEV END,0)  Z16_QTENAT , 
    (Z16_QTENAT * Z16_PMEMB)- (ISNULL(CASE WHEN TIPOVO IN ('P','E') THEN VALOR_CV END,0)) Z16_PMEMB, 
    Z16_QTLIQ, (Z16_QTLIQ * Z16_PMLIQ) Z16_PMLIQ,  DCMDCO, Z16_QTDEV QTDEV, Z16_QTBONI QTBONI, Z16_QTREP QTREP, Z16_DBAGEM QTDBAGEM, Z16_VLRDB VLRDB, (SELECT DISTINCT A1_COD FROM SA1010 WHERE A1_COD = Z16_CLIENT) CLIENTE 
    FROM FATMENSAL 
    INNER JOIN SA3010 ON Z16_VEND = A3_COD 
    INNER JOIN SX5010 ON X5_TABELA = 'A2' AND Z16_REGEST =  X5_CHAVE AND X5_FILIAL = '01'
    WHERE Z16_DATA BETWEEN '20130601' AND '20130630' 

    ) B
    GROUP BY  A3_NREDUZ, Z16_CAT

    union all

    SELECT  '' A3_NREDUZ, '' Z16_CAT, 
    SUM(Z16_QTNAT) Z16_QTNAT,
    CASE WHEN SUM(Z16_QTNAT)  = 0 THEN 0 ELSE SUM(Z16_PMNAT) / CASE WHEN SUM(Z16_QTNAT) < 0 AND  SUM(Z16_QTNAT) < 0 THEN SUM(Z16_QTNAT)  * -1  ELSE SUM(Z16_QTNAT) END  END AS Z16_PMNAT, 
    SUM(Z16_QTENAT) Z16_QTENAT, 
    CASE WHEN SUM(Z16_QTENAT) = 0 THEN 0 ELSE SUM(Z16_PMEMB) / CASE WHEN SUM(Z16_QTENAT) < 0 AND SUM(Z16_QTENAT) < 0 THEN SUM(Z16_QTENAT) * -1   ELSE SUM(Z16_QTENAT) END  END AS Z16_PMEMB, 
    SUM (Z16_QTLIQ) Z16_QTLIQ, CASE WHEN SUM (Z16_QTLIQ) = 0 THEN 0 ELSE SUM(Z16_PMLIQ) / SUM(Z16_QTLIQ)  END AS Z16_PMLIQ,
    SUM(DCMDCO) AS DCMDCO,SUM(QTDEV) QTDEV,SUM(QTBONI) QTBONI,SUM(QTREP) QTREP,SUM(QTDBAGEM) QTDBAGEM,SUM(VLRDB) VLRDB, ISNULL(COUNT(DISTINCT CLIENTE), 0) CLIENTE
    FROM (
    SELECT     Z16_FILIAL, UPPER(A3_NREDUZ) A3_NREDUZ, X5_DESCRI, Z16_CAT, Z16_FRETE, Z16_UF, 
    Z16_QTNAT  - (ISNULL(CASE WHEN TIPOVO IN ('G','P','E') THEN Z16_QTDEV END,0)) Z16_QTNAT, 
    (Z16_QTNAT * Z16_PMNAT) - ((ISNULL(CASE WHEN TIPOVO IN ('G','P','E') THEN VALOR_CV END,0))) Z16_PMNAT,  
    Z16_QTENAT - ISNULL(CASE WHEN TIPOVO IN ('P','E') THEN Z16_QTDEV END,0)  Z16_QTENAT , 
    (Z16_QTENAT * Z16_PMEMB)- (ISNULL(CASE WHEN TIPOVO IN ('P','E') THEN VALOR_CV END,0)) Z16_PMEMB, 
    Z16_QTLIQ, (Z16_QTLIQ * Z16_PMLIQ) Z16_PMLIQ,  DCMDCO, Z16_QTDEV QTDEV, Z16_QTBONI QTBONI, Z16_QTREP QTREP, Z16_DBAGEM QTDBAGEM, Z16_VLRDB VLRDB, (SELECT DISTINCT A1_COD FROM SA1010 WHERE A1_COD = Z16_CLIENT) CLIENTE 
    FROM FATMENSAL 
    INNER JOIN SA3010 ON Z16_VEND = A3_COD 
    INNER JOIN SX5010 ON X5_TABELA = 'A2' AND Z16_REGEST =  X5_CHAVE AND X5_FILIAL = '01'
    WHERE Z16_DATA BETWEEN '20130601' AND '20130630' 

    ) B
    GROUP BY  A3_NREDUZ, Z16_CAT



    HENRY CHARRIERE

    segunda-feira, 15 de julho de 2013 20:03

Todas as Respostas

  • Henry, se a sua ideia é trazer os distintos ao inves do "Union ALL" utilize somente "Union".

    Alexandre Matayosi Conde Mauricio.

    segunda-feira, 15 de julho de 2013 20:49
  • Deleted
    segunda-feira, 15 de julho de 2013 20:58
  • Muito Obrigado José e Alexandre pela ajuda!

    O primeiro Select vai me trazer o resultado que eu quero.

    No segundo Select vou ter a somatória desses valores, mas como no segundo tenho um count(distinct xxx) ele não está trazendo 2 valores que se repetem. 

    Por isso que estava tentando fazer de outra forma meu segundo select para fazer esse somatório.

    Atc,

    Henry


    HENRY CHARRIERE

    terça-feira, 16 de julho de 2013 00:43