sql >> Database teknologi >  >> RDS >> Oracle

Hvordan går man om en kolonne med forskellige værdier i samme række i sql?

Med hensyn til de tidligere kommentarer til borddesign - der er faktisk en redundans i tabellen; du kunne gemme empnavnet i en anden tabel, som du ville forbinde med din tabel her for at undgå det; enhver redundans er en potentiel modsigelse. Men hvis vi har et tabeldesign, der er optimeret til at forespørge og minimere nødvendige joinforbindelser, kan det blive udfyldt i et batchjob fra et andet sted, og så ville designet være passende.

Det du vil gøre her, omtales ofte som 'horisontal pivotering'. Vi mangler noget info her, så jeg antager et maksimalt antal lån på 2. Vi har brug for en mekanisme, der gør det muligt for os at lægge data i col1 eller col2, afhængigt af om det er den første eller anden række for den samme empno. Det er derfor, vi genererer et sekvensnummer. Til sidst bruger vi et SUM(CASE seq WHEN ...) udtryk sammen med en GROUP BY for at reducere antallet af rækker og udjævne tabellen.

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

Godt at spille

Marco




  1. Bestil tabel efter nærhed til specifik breddegrad/længdegrad (ved hjælp af MySQL+PHP)

  2. Sammenligning af strenge med en med tomme mellemrum før, mens den anden ikke har

  3. Opdater MySQL-tabel og ignorer duplikerede poster

  4. Få MAX fra en GROUP BY