Wat betreft de eerdere opmerkingen over tafelontwerp - er is in feite een redundantie in de tabel; je zou de empname in een andere tabel kunnen opslaan, die je zou samenvoegen met je tabel hier om dat te voorkomen; elke redundantie is een potentiële tegenstrijdigheid. Als we echter een tabelontwerp hebben dat is geoptimaliseerd voor het opvragen en minimaliseren van noodzakelijke joins, kan het worden ingevuld in een batchtaak van ergens anders, en dan zou het ontwerp geschikt zijn.
Wat je hier wilt doen, wordt vaak 'horizontal pivoting' genoemd. We missen hier wat info, dus ik ga uit van een maximum aantal leningen van 2. We hebben een mechanisme nodig waarmee we gegevens in col1 of col2 kunnen zetten. afhankelijk van of het de eerste of tweede rij is voor dezelfde empno. Daarom genereren we een volgnummer. Ten slotte gebruiken we een SUM(CASE seq WHEN ...)-expressie in combinatie met een GROUP BY om het aantal rijen te verminderen en de tabel af te vlakken.
Hier gaat het:
-- 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
;
Veel plezier met spelen
Marco