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