# Duvida Somatório

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