Pokud jde o předchozí komentáře k návrhu tabulky - tabulka je ve skutečnosti nadbytečná; můžete uložit empname do jiné tabulky, kterou byste spojili se svou tabulkou zde, abyste tomu zabránili; každá redundance je potenciální rozpor. Pokud však máme návrh tabulky optimalizovaný pro dotazování a minimalizaci nezbytných spojení, může být naplněn v dávkové úloze odjinud, a pak by byl návrh vhodný.
To, co zde chcete udělat, se často označuje jako „horizontální pivotování“. Chybí nám zde nějaké informace, takže předpokládám maximální počet výpůjček 2. Potřebujeme mechanismus, který nám umožní vkládat data do sloupců1 nebo sloupců2, podle toho, zda je to první nebo druhá řada pro stejné empno. Proto generujeme pořadové číslo. Nakonec použijeme výraz SUM(CASE seq WHEN ...) ve spojení s výrazem GROUP BY, abychom snížili počet řádků a srovnali tabulku.
Tady:
-- 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
;
Příjemné hraní
Marco