sql >> Databasteknik >  >> RDS >> Oracle

Hur går man tillväga för en kolumn med olika värden i samma rad i sql?

När det gäller de tidigare kommentarerna om bordsdesign - det finns faktiskt en redundans i tabellen; du kan lagra empname i en annan tabell, som du skulle slå ihop med din tabell här för att undvika det; Varje redundans är en potentiell motsägelse. Men om vi har en tabelldesign optimerad för att söka och minimera nödvändiga kopplingar, kan den fyllas i ett batch-jobb från någon annanstans, och då skulle designen vara lämplig.

Det du vill göra här kallas ofta för "horisontell pivotering". Vi saknar viss information här, så jag utgår från ett maximalt antal lån på 2. Vi behöver en mekanism som gör att vi kan lägga data i col1 eller col2, beroende på om det är första eller andra raden för samma empno. Det är därför vi genererar ett sekvensnummer. Slutligen använder vi ett SUM(CASE seq WHEN ...)-uttryck i kombination med en GROUP BY för att minska antalet rader och platta till tabellen.

Här kommer:

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

Lycka till med att spela

Marco




  1. Spotlight Cloud Basic:Bästa gratis verktyg för övervakning av databasprestanda

  2. SQL LIKE-villkor för att söka efter heltal?

  3. Mysql Generera varje datum från datumintervalllistan

  4. Har en Join-tabell (associationstabell) en primärnyckel? många till många förhållande