Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como fazer uma coluna com valores diferentes em uma mesma linha no sql?


Com relação aos comentários anteriores sobre o design da tabela - há, de fato, uma redundância na tabela; você poderia armazenar o empname em outra tabela, que você juntaria com sua tabela aqui para evitar isso; toda redundância é uma contradição em potencial. No entanto, se tivermos um design de tabela otimizado para consultar e minimizar as junções necessárias, ele poderá ser preenchido em um trabalho em lote de outro lugar e, então, o design será apropriado.

O que você quer fazer aqui é frequentemente chamado de 'pivotagem horizontal'. Faltam algumas informações aqui, então estou assumindo um número máximo de empréstimos de 2. Precisamos de um mecanismo que nos permita colocar dados em col1 ou col2, dependendo se é a primeira ou segunda linha para o mesmo empno. É por isso que geramos um número de sequência. Finalmente, usamos uma expressão SUM(CASE seq WHEN ...) em conjunto com um GROUP BY para reduzir o número de linhas e nivelar a tabela.

Aqui vai:
-- first global table expression - the input table
-- The table could exist already, and then this would not be needed.
WITH foo(empno,empname,loanref,amount) AS (
          SELECT  1,'abc',123,100
UNION ALL SELECT  1,'abc',456,200
)
-- second global table expression - add sequence number
-- this needs to be in the query
,    foo_numbered AS (
SELECT
  -- need a number: 1 for the first, 2 for the second loan
  ROW_NUMBER() OVER(PARTITION BY empname ORDER BY loanref) AS seq
, *
FROM foo
)
SELECT
  empno
, empname
, MAX(CASE seq WHEN 1 THEN loanref END) AS loanref_1
, SUM(CASE seq WHEN 1 THEN amount END) AS amount_1
, MAX(CASE seq WHEN 2 THEN loanref END) AS loanref_2
, SUM(CASE seq WHEN 2 THEN amount END) AS amount_2
FROM foo_numbered
GROUP BY
  empno
, empname
;

Feliz jogando

Marco