Fórum Fb 1.0. Ajuda com Select UNION #54314

19/12/2005

0

Olá Pessoal, estou tentando fazer a união entre 2 selects com os seguintes campos:

[list:187bc4ee41][*:187bc4ee41]ID_PROPRIETARIO
[*:187bc4ee41]PNUMBER
[*:187bc4ee41]DESCR_PNUMBER
[*:187bc4ee41]QTDE_ENTRADA
[*:187bc4ee41]QTDE_SAIDA[/list:u:187bc4ee41]

segue o select, mas, ainda errado:

  SELECT NFEC.ID_PROPRIETARIO,
         NFEI.PNUMBER,
         PROD.DESCR_PNUMBER,
         SUM(NFEI.QTDE_PRODUTO) AS QTDE_ENTRADA
    FROM KSR_NFE      NFEC,
         KSR_NFE_IT   NFEI,
         PNUMBER      PROD,
         TB_NOSSA_NFE ENTR
   WHERE NFEC.NUM_NFE       = NFEI.NUM_NFE
     AND NFEC.SERIE_NFE     = NFEI.SERIE_NFE
     AND NFEC.ID_FORNECEDOR = NFEI.ID_FORNECEDOR
     AND NFEI.PNUMBER       = PROD.PNUMBER
     AND ENTR.NNUMERO       = NFEC.NUM_NFE
     AND NFEC.SERIE_NFE     = ´IN´
     AND ENTR.SSTATUS       = ´F´
GROUP BY NFEC.ID_PROPRIETARIO,
         NFEI.PNUMBER,
         PROD.DESCR_PNUMBER

UNION ALL

  SELECT NFSC.ID_PROPRIETARIO,
         NFSI.PNUMBER,
         PROD.DESCR_PNUMBER,
         SUM(NFSI.QTDE) AS QTDE_SAIDA
    FROM KSR_NFS      NFSC,
         KSR_NFS_IT   NFSI,
         PNUMBER      PROD,
         TB_NOSSA_NFS SAID
   WHERE NFSC.NUM_NFS   = NFSI.NUM_NFS
     AND NFSC.SERIE_NFS = NFSI.SERIE_NFS
     AND NFSI.PNUMBER   = PROD.PNUMBER
     AND SAID.NNUMERO   = NFSC.NUM_NFS
     AND NFSC.SERIE_NFS = ´IN´
     AND SAID.SSTATUS   = ´F´
GROUP BY NFSC.ID_PROPRIETARIO,
         NFSI.PNUMBER,
         PROD.DESCR_PNUMBER
ORDER BY 1,2



o que eu quero é que venha o campo qtde_entrada e qtde_saida, dai pensei assim:


  SELECT NFEC.ID_PROPRIETARIO,
         NFEI.PNUMBER,
         PROD.DESCR_PNUMBER,
         SUM(NFEI.QTDE_PRODUTO) AS QTDE_ENTRADA,
         0 as QTDE_SAIDA
    FROM KSR_NFE      NFEC,
         KSR_NFE_IT   NFEI,
         PNUMBER      PROD,
         TB_NOSSA_NFE ENTR
   WHERE NFEC.NUM_NFE       = NFEI.NUM_NFE
     AND NFEC.SERIE_NFE     = NFEI.SERIE_NFE
     AND NFEC.ID_FORNECEDOR = NFEI.ID_FORNECEDOR
     AND NFEI.PNUMBER       = PROD.PNUMBER
     AND ENTR.NNUMERO       = NFEC.NUM_NFE
     AND NFEC.SERIE_NFE     = ´IN´
     AND ENTR.SSTATUS       = ´F´
GROUP BY NFEC.ID_PROPRIETARIO,
         NFEI.PNUMBER,
         PROD.DESCR_PNUMBER

UNION ALL

  SELECT NFSC.ID_PROPRIETARIO,
         NFSI.PNUMBER,
         PROD.DESCR_PNUMBER,
         0 AS QTDE_ENTRADA,
         SUM(NFSI.QTDE) AS QTDE_SAIDA
    FROM KSR_NFS      NFSC,
         KSR_NFS_IT   NFSI,
         PNUMBER      PROD,
         TB_NOSSA_NFS SAID
   WHERE NFSC.NUM_NFS   = NFSI.NUM_NFS
     AND NFSC.SERIE_NFS = NFSI.SERIE_NFS
     AND NFSI.PNUMBER   = PROD.PNUMBER
     AND SAID.NNUMERO   = NFSC.NUM_NFS
     AND NFSC.SERIE_NFS = ´IN´
     AND SAID.SSTATUS   = ´F´
GROUP BY NFSC.ID_PROPRIETARIO,
         NFSI.PNUMBER,
         PROD.DESCR_PNUMBER
ORDER BY 1,2



so que nao pega

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Invalid command.
Data type unknown.



Alguém saberia oque pode ser? :?


Otto

Otto

Responder

Posts

19/12/2005

Bferreira

Os campos que vc esta unindo com o union tem os mesmo tipos. Por exemplo, para conseguir fazer a união dos resultados dos dois selects, é necessário q todos os valores retornados por um select tenha exatamente o mesmo tipo de dado do segundo select:

Ex.

select NFEC.ID_PROPRIETARIO, [b:018565005f]-- se for inteiro[/b:018565005f]
NFEI.PNUMBER, -- [b:018565005f]se for varchar(20)[/b:018565005f]
PROD.DESCR_PNUMBER,
SUM(NFEI.QTDE_PRODUTO) AS QTDE_ENTRADA,
0 as QTDE_SAIDA
...
union
select NFSC.ID_PROPRIETARIO, [b:018565005f]-- tem que ser inteiro tbm[/b:018565005f]
NFSI.PNUMBER, -- [b:018565005f]tem que ser varchar(20) tbm[/b:018565005f]
PROD.DESCR_PNUMBER,
0 AS QTDE_ENTRADA,
SUM(NFSI.QTDE) AS QTDE_SAIDA

Caso algum dos valores forem d tipos diferentes esse erro será retornado.

Espero ter ajudado...


Responder

Gostei + 0

19/12/2005

Emerson Nascimento

verifique também o tipo dos campos agregados.

tente algo assim:
SELECT NFEC.ID_PROPRIETARIO, 
         NFEI.PNUMBER, 
         PROD.DESCR_PNUMBER, 
         SUM(NFEI.QTDE_PRODUTO) AS QTDE_ENTRADA, 
         cast(0 as float) as QTDE_SAIDA 
    FROM KSR_NFE      NFEC, 
         KSR_NFE_IT   NFEI, 
         PNUMBER      PROD, 
         TB_NOSSA_NFE ENTR 
   WHERE NFEC.NUM_NFE       = NFEI.NUM_NFE 
     AND NFEC.SERIE_NFE     = NFEI.SERIE_NFE 
     AND NFEC.ID_FORNECEDOR = NFEI.ID_FORNECEDOR 
     AND NFEI.PNUMBER       = PROD.PNUMBER 
     AND ENTR.NNUMERO       = NFEC.NUM_NFE 
     AND NFEC.SERIE_NFE     = ´IN´ 
     AND ENTR.SSTATUS       = ´F´ 
GROUP BY NFEC.ID_PROPRIETARIO, 
         NFEI.PNUMBER, 
         PROD.DESCR_PNUMBER 

UNION ALL 

  SELECT NFSC.ID_PROPRIETARIO, 
         NFSI.PNUMBER, 
         PROD.DESCR_PNUMBER, 
         cast(0 as float) AS QTDE_ENTRADA, 
         SUM(NFSI.QTDE) AS QTDE_SAIDA 
    FROM KSR_NFS      NFSC, 
         KSR_NFS_IT   NFSI, 
         PNUMBER      PROD, 
         TB_NOSSA_NFS SAID 
   WHERE NFSC.NUM_NFS   = NFSI.NUM_NFS 
     AND NFSC.SERIE_NFS = NFSI.SERIE_NFS 
     AND NFSI.PNUMBER   = PROD.PNUMBER 
     AND SAID.NNUMERO   = NFSC.NUM_NFS 
     AND NFSC.SERIE_NFS = ´IN´ 
     AND SAID.SSTATUS   = ´F´ 
GROUP BY NFSC.ID_PROPRIETARIO, 
         NFSI.PNUMBER, 
         PROD.DESCR_PNUMBER 
ORDER BY 1,2



Responder

Gostei + 0

20/12/2005

Thomaz_prg

Colega, já passei por esse problema... o que ocorre é que, em campos onde definimos manualmente um valor, o firebird não consegue distinguir o tipo que eles são, retornando essa mensagem de erro (claro que os tipos devem ser iguais).
Tente fazer assim, e depois retorne informando se funcionou ou não:

SELECT NFEC.ID_PROPRIETARIO, 
         NFEI.PNUMBER, 
         PROD.DESCR_PNUMBER, 
         CAST( SUM(NFEI.QTDE_PRODUTO) AS FLOAT) AS QTDE_ENTRADA, 
         CAST( 0  AS FLOAT) as QTDE_SAIDA 
    FROM KSR_NFE      NFEC, 
         KSR_NFE_IT   NFEI, 
         PNUMBER      PROD, 
         TB_NOSSA_NFE ENTR 
   WHERE NFEC.NUM_NFE       = NFEI.NUM_NFE 
     AND NFEC.SERIE_NFE     = NFEI.SERIE_NFE 
     AND NFEC.ID_FORNECEDOR = NFEI.ID_FORNECEDOR 
     AND NFEI.PNUMBER       = PROD.PNUMBER 
     AND ENTR.NNUMERO       = NFEC.NUM_NFE 
     AND NFEC.SERIE_NFE     = ´IN´ 
     AND ENTR.SSTATUS       = ´F´ 
GROUP BY NFEC.ID_PROPRIETARIO, 
         NFEI.PNUMBER, 
         PROD.DESCR_PNUMBER 

UNION ALL 

  SELECT NFSC.ID_PROPRIETARIO, 
         NFSI.PNUMBER, 
         PROD.DESCR_PNUMBER, 
         CAST(0 AS FLOAT) AS QTDE_ENTRADA, 
         CAST( SUM(NFSI.QTDE) AS FLOAT ) AS QTDE_SAIDA 
    FROM KSR_NFS      NFSC, 
         KSR_NFS_IT   NFSI, 
         PNUMBER      PROD, 
         TB_NOSSA_NFS SAID 
   WHERE NFSC.NUM_NFS   = NFSI.NUM_NFS 
     AND NFSC.SERIE_NFS = NFSI.SERIE_NFS 
     AND NFSI.PNUMBER   = PROD.PNUMBER 
     AND SAID.NNUMERO   = NFSC.NUM_NFS 
     AND NFSC.SERIE_NFS = ´IN´ 
     AND SAID.SSTATUS   = ´F´ 
GROUP BY NFSC.ID_PROPRIETARIO, 
         NFSI.PNUMBER, 
         PROD.DESCR_PNUMBER 
ORDER BY 1,2



Responder

Gostei + 0

20/12/2005

Otto

funcionou perfeitamente thomaz_prg, obrigado a todos e um feliz natal :)


Responder

Gostei + 0

20/12/2005

Otto

Olá Pessoal, oia eu denovo, seguinte:

analisando os registros encontrados, percebi que, os produtos se repetem, veham só.



Select usado:

   SELECT PROP.RAZAO_SOCIAL_PROPRIETARIO,
          NFEI.PNUMBER,
          PROD.DESCR_PNUMBER,
          SUM(NFEI.QTDE_PRODUTO) AS QTDE_ENTRADA,
          CAST(´0.00´  AS FLOAT) as QTDE_SAIDA
     FROM KSR_NFE      NFEC,
          KSR_NFE_IT   NFEI,
          PNUMBER      PROD,
          TB_NOSSA_NFE ENTR,
          PROPRIETARIO PROP
    WHERE NFEC.NUM_NFE         = NFEI.NUM_NFE
      AND NFEC.SERIE_NFE       = NFEI.SERIE_NFE
      AND NFEC.ID_FORNECEDOR   = NFEI.ID_FORNECEDOR
      AND PROP.ID_PROPRIETARIO = NFEC.ID_PROPRIETARIO
      AND NFEI.PNUMBER         = PROD.PNUMBER
      AND ENTR.NNUMERO         = NFEC.NUM_NFE
      AND NFEC.SERIE_NFE       = ´IN´
      AND ENTR.SSTATUS         = ´F´
 GROUP BY NFEC.ID_PROPRIETARIO,
          PROP.RAZAO_SOCIAL_PROPRIETARIO,
          NFEI.PNUMBER,
          PROD.DESCR_PNUMBER
 UNION ALL
   SELECT PROP.RAZAO_SOCIAL_PROPRIETARIO,
          NFSI.PNUMBER,
          PROD.DESCR_PNUMBER,
          CAST(´0.00´ AS FLOAT) AS QTDE_ENTRADA,
          SUM(NFSI.QTDE) AS QTDE_SAIDA
     FROM KSR_NFS      NFSC,
          KSR_NFS_IT   NFSI,
          PNUMBER      PROD,
          TB_NOSSA_NFS SAID,
          PROPRIETARIO PROP
    WHERE NFSC.NUM_NFS         = NFSI.NUM_NFS
      AND NFSC.SERIE_NFS       = NFSI.SERIE_NFS
      AND PROP.ID_PROPRIETARIO = NFSC.ID_PROPRIETARIO
      AND NFSI.PNUMBER         = PROD.PNUMBER
      AND SAID.NNUMERO         = NFSC.NUM_NFS
      AND NFSC.SERIE_NFS       = ´IN´
      AND SAID.SSTATUS         = ´F´
 GROUP BY NFSC.ID_PROPRIETARIO,
          PROP.RAZAO_SOCIAL_PROPRIETARIO,
          NFSI.PNUMBER,
          PROD.DESCR_PNUMBER




Imagem dos registros:

[URL=http://img16.imageshack.us/my.php?image=untitled17jr.gif][img:a8f9ad416e]http://img16.imageshack.us/img16/9454/untitled17jr.th.gif[/img:a8f9ad416e][/URL]

é o seguinte, era pra em apenas uma linha, vir o valor da coluna qtde_entrada e qtde_saida, so que, vem uma linha com a coluna qtde_entrada preenchida e qtde-saida com 0, e na outra linha o inverso, na imagem vai da pra voces perceberem.

:oops:


Responder

Gostei + 0

20/12/2005

Thomaz_prg

Achei que o que você queria era isso mesmo, mas enfim...

Bom, pra você não ter que refazer o select, você pode criar uma view, usando o select, e dar apenas um select na view:

-para criar a view:

Create View NomeDaView( campo1,campo2...)
As
Select ...


-para visualizar da forma como você quer:

SELECT 
    RAZAO_SOCIAL_PROPRIETARIO, 
    PNUMBER, 
    DESCR_PNUMBER, 
    SUM(QTDE_ENTRADA), 
    SUM(QTDE_SAIDA)
FROM
    SUAVIEW
GROUP BY 1,2,3



Responder

Gostei + 0

21/12/2005

Otto

redondinho :lol:


agora sim vou ter um natal feliz :lol:


valeu pessoal.. abraço :P


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar