TransWikia.com

União de dois selects que apresentam em linha

Stack Overflow em Português Asked by Adair Juneo on January 31, 2021

Abaixo, segue uma consulta realizada para banco de dados ORACLE:

SELECT
ITOS.CD_NUMERO_OS,
ITOS.DESCRICAO_RECLA AS "DEFEITO APRESENTADO"

FROM GMITEMOS ITOS

INNER JOIN GMOSERVI OS ON OS.CD_NUMERO_OS = ITOS.CD_NUMERO_OS
INNER JOIN GMITEMOS IT ON IT.CD_NUMERO_OS = ITOS.CD_NUMERO_OS

WHERE OS.DT_OS BETWEEN TO_DATE(:data_os_inicial, 'DD/MM/YYYY') AND TO_DATE(:data_os_final, 'DD/MM/YYYY')
AND OS.SITUACAO LIKE 'E'
AND IT.TIPO_OS LIKE '3'

UNION

SELECT DISTINCT
ITOS.CD_NUMERO_OS,
SL.DESCRICAO_SOLUC AS "SOLUCAO DO DEFEITO"

FROM GMITEMOS ITOS

INNER JOIN GMOSERVI OS ON OS.CD_NUMERO_OS = ITOS.CD_NUMERO_OS
INNER JOIN GMITEMOS IT ON IT.CD_NUMERO_OS = ITOS.CD_NUMERO_OS
INNER JOIN GMDETALH SL ON SL.CD_NUMERO_OS = ITOS.CD_NUMERO_OS

WHERE OS.DT_OS BETWEEN TO_DATE(:data_os_inicial, 'DD/MM/YYYY') AND TO_DATE(:data_os_final, 'DD/MM/YYYY')
AND OS.SITUACAO LIKE 'E'
AND IT.TIPO_OS LIKE '3'

Segue abaixo um PRINT de como as informações estão sendo entregues em tela:
Resultado da consulta citada acima

Como podemos observar, é apresentado um DEFEITO e logo após uma SOLUÇÃO para o mesmo nº de OS(CD_NUMERO_OS).
Por exemplo na OS com CD_NUMERO_OS = 860, o item 1 da grade é um DEFEITO e o item 2 é uma SOLUÇÃO.
Preciso exibir o DEFEITO E SOLUÇÃO lado a lado, exibir em formato de colunas e não em linhas conforme o print acima.

Alguma idéia de como posso exibir esse resultado lado a lado???

Detalhe: A OS com CD_NUMERO_OS = 866 aparece 3 vezes um DEFEITO e 3 vezes uma SOLUÇÃO por que a mesma OS possui 3 itens diferentes.

2 Answers

SELECT DISTINCT
    
ITOS.CD_NUMERO_OS,
ITOS.ITEM AS "ITEM DA OS",
ITOS.DESCRICAO_RECLA AS "DEFEITO APRESENTADO",
NVL(SL.DESCRICAO_SOLUC, 'NAO RESOLVIDO') AS "SOLUCAO DO DEFEITO"

FROM GMITEMOS ITOS,    
GMOSERVI OS,
GMITEMOS IT, 
GMDETALH SL

WHERE OS.DT_OS BETWEEN TO_DATE(:data_os_inicial, 'DD/MM/YYYY') AND TO_DATE(:data_os_final, 'DD/MM/YYYY')
AND OS.CD_NUMERO_OS = ITOS.CD_NUMERO_OS
AND IT.CD_NUMERO_OS = ITOS.CD_NUMERO_OS
AND SL.CD_NUMERO_OS(+) = ITOS.CD_NUMERO_OS
AND OS.SITUACAO LIKE 'E'
AND IT.TIPO_OS LIKE '3'

ORDER BY itos.cd_numero_os ASC, itos.item ASC

Segue o print do resultado. Resultado da consulta citada acima

Answered by Adair Juneo on January 31, 2021

Reescreva seu select desta forma:

SELECT
    
ITOS.CD_NUMERO_OS,
ITOS.DESCRICAO_RECLA AS "DEFEITO APRESENTADO",
NVL(SL.DESCRICAO_SOLUC, 'NAO RESOLVIDO') AS "SOLUCAO DO DEFEITO"

FROM GMITEMOS ITOS,    
GMOSERVI OS,
GMITEMOS IT, 
GMDETALH SL

WHERE OS.DT_OS BETWEEN TO_DATE(:data_os_inicial, 'DD/MM/YYYY') AND TO_DATE(:data_os_final, 'DD/MM/YYYY')
AND OS.CD_NUMERO_OS = ITOS.CD_NUMERO_OS
AND IT.CD_NUMERO_OS = ITOS.CD_NUMERO_OS
AND IT.ITEM = ITOS.ITEM /* faltou esse */
AND SL.CD_NUMERO_OS(+) = ITOS.CD_NUMERO_OS
AND OS.SITUACAO LIKE 'E'
AND IT.TIPO_OS LIKE '3'

Eu prefiro usar equijoins, pois já vi casos (principalmente em SQL montado pelo EntityFramework da plataforma .NET) que com inner join fica mais lento, mas aí vc pode fazer um comparativo e ver qual forma é melhor.

Veja que para relacionar a tabela SL eu usei o operador (+) que indica um LEFT JOIN, pois um defeito pode não ter sido resolvido

Answered by JMSlasher on January 31, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP