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:
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.
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
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
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP