sql >> Base de Datos >  >> RDS >> Oracle

¿Cómo abordar una columna con diferentes valores en una misma fila en sql?

Con respecto a los comentarios anteriores sobre el diseño de la mesa, de hecho, hay una redundancia en la mesa; podría almacenar el empname en otra tabla, que uniría con su tabla aquí para evitar eso; cada redundancia es una posible contradicción. Sin embargo, si tenemos un diseño de tabla optimizado para consultar y minimizar las uniones necesarias, podría completarse en un trabajo por lotes desde otro lugar y, entonces, el diseño sería apropiado.

Lo que desea hacer aquí a menudo se denomina "pivote horizontal". Nos falta información aquí, por lo que asumo un número máximo de préstamos de 2. Necesitamos un mecanismo que nos permita poner datos en col1 o col2, dependiendo si es la primera o segunda fila para el mismo empno. Es por eso que generamos un número de secuencia. Finalmente, usamos una expresión SUM(CASE seq WHEN ...) junto con GROUP BY para reducir el número de filas y aplanar la tabla.

Aquí va:

-- 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 jugando

Marco