Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment s'y prendre pour une colonne avec des valeurs différentes dans une même ligne en sql ?

Concernant les commentaires précédents sur la conception du tableau - il y a, en fait, une redondance dans le tableau ; vous pouvez stocker le empname dans une autre table, que vous joindrez à votre table ici pour éviter cela ; chaque redondance est une contradiction potentielle. Cependant, si nous avons une conception de table optimisée pour interroger et minimiser les jointures nécessaires, elle peut être remplie dans un travail par lots à partir d'un autre endroit, et alors la conception serait appropriée.

Ce que vous voulez faire ici est souvent appelé "pivotement horizontal". Nous manquons d'informations ici, donc je suppose un nombre maximum de prêts de 2. Nous avons besoin d'un mécanisme qui nous permette de mettre des données dans col1 ou col2, selon qu'il s'agit de la première ou de la deuxième ligne pour le même empno. C'est pourquoi nous générons un numéro de séquence. Enfin, nous utilisons une expression SUM(CASE seq WHEN ...) en conjonction avec un GROUP BY pour réduire le nombre de lignes et aplatir le tableau.

Voici :

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

Bon jeu

Marco