Array
(
)

subconsultas retornam 2 linhas

Alexandre
   - 18 dez 2013

Boa tarde, estou fazendo uma subconsulta mas esta aparecendo o resultado em duas linhas, em outra subconsulta que fiz somando valores deu certo, o resulado desta consulta são dados alfanumericos, o que estou fazendo de errado?
SELECT DISTINCT
TIPO AS TIPO,
DANFE AS DANFE,
DATA_EMISSAO AS DATA_EMISSAO,
DT_LANC_SISTEMA AS DT_LANC_SISTEMA,
FORNECEDOR AS FORNECEDOR,
LOJA AS LOJA,
RAZAO AS RAZAO,
COD_PRODUTO AS COD_PRODUTO,
DESCRICAO AS DESCRICAO,
VALOR_PROD AS VALOR_PROD,
VALOR_DANFE AS VALOR_DANFE,
NATUREZA AS NATUREZA,
DESC_NAT AS DESC_NAT
FROM (
SELECT DISTINCT
D1_TIPO AS TIPO,
F1_DOC AS DANFE,
F1_EMISSAO AS DATA_EMISSAO,
F1_DTDIGIT AS DT_LANC_SISTEMA,
F1_FORNECE AS FORNECEDOR,
F1_LOJA AS LOJA,
A2_NOME AS RAZAO,
D1_COD AS COD_PRODUTO,
B1_DESC AS DESCRICAO,
D1_TOTAL AS VALOR_PROD,
F1_VALBRUT AS VALOR_DANFE,
'' AS NATUREZA,
'' AS DESC_NAT
FROM SD1010 JOIN SF1010 ON D1_DOC = F1_DOC
AND D1_SERIE = F1_SERIE
AND D1_FORNECE = F1_FORNECE
AND D1_LOJA = F1_LOJA

JOIN SB1010 ON B1_FILIAL = ' '
AND B1_COD = D1_COD

JOIN SA2010 ON A2_COD = F1_FORNECE
AND A2_LOJA = F1_LOJA

WHERE D1_DTDIGIT >= '20131201'--RIGHT(Convert(varchar,:DataDe),4)+SUBSTRING(Convert(varchar,:DataDe),3,2)+LEFT(Convert(varchar,:DataDe),2)
AND D1_DTDIGIT <= '20131217'--RIGHT(Convert(varchar,:DataDe),4)+SUBSTRING(Convert(varchar,:DataDe),3,2)+LEFT(Convert(varchar,:DataDe),2)
AND D1_TIPO = 'N'
AND SD1010.D_E_L_E_T_ <>'*'
AND SB1010.D_E_L_E_T_ <>'*'
AND SF1010.D_E_L_E_T_ <>'*'
AND SA2010.D_E_L_E_T_ <>'*'
GROUP BY D1_TIPO,F1_DOC,F1_FORNECE,F1_LOJA,A2_NOME, D1_TIPO,D1_COD, B1_DESC, F1_VALBRUT,F1_EMISSAO,F1_DTDIGIT
, F1_VALMERC,B1_GRUPO, D1_TOTAL
UNION ALL
SELECT DISTINCT
'',
E2_NUM AS DANFE,
'',
'',
E2_FORNECE AS FORNECEDOR,
E2_LOJA AS LOJA,
'',
'',
'',
'',
'',
E2_NATUREZ AS NATUREZA,
ED_DESCRIC AS DESC_NAT
FROM SE2010 INNER JOIN SF1010 ON E2_NUM = F1_DOC
AND E2_FORNECE = F1_FORNECE
AND E2_LOJA = F1_LOJA
INNER JOIN SED010 ON ED_CODIGO = E2_NATUREZ

INNER JOIN SD1010 ON D1_DOC = F1_DOC
AND D1_SERIE = F1_SERIE
AND D1_FORNECE = F1_FORNECE
AND D1_FILIAL = F1_FILIAL

WHERE E2_EMIS1 >= '20131201'
AND E2_EMIS1 <= '20131217'
AND SE2010.D_E_L_E_T_ <> '*'
AND SED010.D_E_L_E_T_ <> '*'
--AND E2_NUM IN ('000005018','000005970')
GROUP BY E2_NUM, E2_FORNECE, E2_LOJA, E2_NATUREZ, ED_DESCRIC

) AS A INNER JOIN SA2010 ON A.FORNECEDOR = A2_COD
AND A.LOJA = A2_LOJA
--) AS A INNER JOIN SB1010 ON A.COD_PRODUTO = B1_COD
GROUP BY A.DANFE,A.TIPO,A.DATA_EMISSAO,A.DT_LANC_SISTEMA, A.FORNECEDOR,A.LOJA,A.RAZAO,
A.COD_PRODUTO,A.DESCRICAO, A.VALOR_DANFE, A.VALOR_PROD, A.NATUREZA, A.DESC_NAT
Segue abaixo o resultado de um exemplo do resultado da consulta
TIPO DANFE FORNECEDOR LOJA RAZAO COD_PRODUTO DESCRICAO VALOR_PROD VALOR_DANFE NATUREZA
3 1910 1 0 0 10.101.09
N 3 1910 1 FLAVIA 300082 CONFECCAO 640 640

Desde já obrigado

Alexandre
   - 18 dez 2013

Clique na imagem para abrir em uma nova janelacomo

Isaac Jose
   - 18 dez 2013

deve estar faltando algo no group by pois esta trazendo informações diferentes nas colunas ora traz em branco e na linha de baixo traz informação.
tente colocar o max nesses campos ai ele ira trazer somente o max de cada coluna.....

Cléverson Specht
|
MVP
Pontos: 800
    19 dez 2013

Boa tarde,

Pelo que analisei está duplicando as linhas pelo retorno desse select:

#CódigoSELECT DISTINCT
'',
E2_NUM AS DANFE,
'',
'',
E2_FORNECE AS FORNECEDOR,
E2_LOJA AS LOJA,
'',
'',
'',
'',
'',
E2_NATUREZ AS NATUREZA,
ED_DESCRIC AS DESC_NAT
FROM SE2010 ...


Alterei a query para que traga o max e o sum de alguns campos corrigindo os campos vazios retornados:

#CódigoSELECT DISTINCT
MAX(TIPO) AS TIPO,
DANFE AS DANFE,
MAX(DATA_EMISSAO) AS DATA_EMISSAO,
MAX(DT_LANC_SISTEMA) AS DT_LANC_SISTEMA,
FORNECEDOR AS FORNECEDOR,
LOJA AS LOJA,
MAX(RAZAO) AS RAZAO,
MAX(COD_PRODUTO) AS COD_PRODUTO,
MAX(DESCRICAO) AS DESCRICAO,
SUM(VALOR_PROD) AS VALOR_PROD,
SUM(VALOR_DANFE) AS VALOR_DANFE,
MAX(NATUREZA) AS NATUREZA,
MAX(DESC_NAT) AS DESC_NAT
FROM (SELECT DISTINCT
D1_TIPO AS TIPO,
F1_DOC AS DANFE,
F1_EMISSAO AS DATA_EMISSAO,
F1_DTDIGIT AS DT_LANC_SISTEMA,
F1_FORNECE AS FORNECEDOR,
F1_LOJA AS LOJA,
A2_NOME AS RAZAO,
D1_COD AS COD_PRODUTO,
B1_DESC AS DESCRICAO,
D1_TOTAL AS VALOR_PROD,
F1_VALBRUT AS VALOR_DANFE,
'' AS NATUREZA,
'' AS DESC_NAT
FROM SD1010
JOIN SF1010 ON D1_DOC = F1_DOC
AND D1_SERIE = F1_SERIE
AND D1_FORNECE = F1_FORNECE
AND D1_LOJA = F1_LOJA
JOIN SB1010 ON B1_FILIAL = ' '
AND B1_COD = D1_COD
JOIN SA2010 ON A2_COD = F1_FORNECE
AND A2_LOJA = F1_LOJA
WHERE D1_DTDIGIT >= '20131201'
AND D1_DTDIGIT <= '20131217'
AND D1_TIPO = 'N'
AND SD1010.D_E_L_E_T_ <> '*'
AND SB1010.D_E_L_E_T_ <> '*'
AND SF1010.D_E_L_E_T_ <> '*'
AND SA2010.D_E_L_E_T_ <> '*'
GROUP
BY D1_TIPO
, F1_DOC
, F1_FORNECE
, F1_LOJA
, A2_NOME
, D1_TIPO
, D1_COD
, B1_DESC
, F1_VALBRUT
, F1_EMISSAO
, F1_DTDIGIT
, F1_VALMERC
, B1_GRUPO
, D1_TOTAL
UNION ALL
SELECT DISTINCT
'',
E2_NUM AS DANFE,
'',
'',
E2_FORNECE AS FORNECEDOR,
E2_LOJA AS LOJA,
'',
'',
'',
'',
'',
E2_NATUREZ AS NATUREZA,
ED_DESCRIC AS DESC_NAT
FROM SE2010
INNER JOIN SF1010 ON E2_NUM = F1_DOC
AND E2_FORNECE = F1_FORNECE
AND E2_LOJA = F1_LOJA
INNER JOIN SED010 ON ED_CODIGO = E2_NATUREZ
INNER JOIN SD1010 ON D1_DOC = F1_DOC
AND D1_SERIE = F1_SERIE
AND D1_FORNECE = F1_FORNECE
AND D1_FILIAL = F1_FILIAL
WHERE E2_EMIS1 >= '20131201'
AND E2_EMIS1 <= '20131217'
AND SE2010.D_E_L_E_T_ <> '*'
AND SED010.D_E_L_E_T_ <> '*'
GROUP
BY E2_NUM
, E2_FORNECE
, E2_LOJA
, E2_NATUREZ
, ED_DESCRIC) AS A
INNER JOIN SA2010 ON A.FORNECEDOR = A2_COD
AND A.LOJA = A2_LOJA
GROUP
BY
DANFE ,
FORNECEDOR ,
LOJA

Alexandre
   - 19 dez 2013

Boa tarde Cléverson, a correção que fez resolveu 50% dos meus problemas, a finalidade desta consulta é relacionar todas as Danfes com seus respectivos itens e as Naturezas Financeiras ( que fica em outra tabela==> SED010 ), e isto deu certo, as Danfes que tem as Naturezas aparecem e as que não tem ficam em branco ótimo, o problema são as Danfes com mais de um item, com o MAX ele relaciona somente o produto com o maior código. Mas obrigado a partir de sua correção vou continuar as tentativas.

Grato