A feladvány itt van.
Tegnap éjjel fájt Benedek hasa, sétálgattam kicsit vele, közben kitaláltam rá egy megoldást, és még jó is az eredménye. :)
Pár nap múlva kirakom a sajátomat, addig is jöhet a tiétek.
Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.
LEAVE A COMMENT
4 COMMENTS
with q(v, vid)
as
(
select amt, vid
from Vouchers v1
union all
select
v+amt, v1.vid
from q, Vouchers v1
where
q.vid<v1.vid
)
select distinct v from q order by 1
Kaz: ügyes, tényleg, kezdek szégyenkezni a saját megoldásommal. :)
SELECT DISTINCT
SUM(v.amt) as amt
FROM
(
SELECT
nt.number
FROM
(
SELECT
row_number() OVER (ORDER BY s1.name) as number
FROM
sysobjects s1
CROSS JOIN sysobjects s2) nt
WHERE nt.number 0)
GROUP BY n.number
Magyarul egy szám bitindexeinek tekintem a vid értékeket, és ezeket minden kominációban ki-be kapcsolgatom, amit úgy érek el, hogy egész számogat generálok, és a bitekre nézem, hogy melyik mikor van bekapcsolva a különböző egész számok bináris ábrázolása esetében. Minden esetben a bekapcsolt bitekhez tartozó értékeket kell összeadni.
Mit mondjak, eléggé gáz módon lehet egész számokat generálni. A CTE és a rekurzív CTE-s megoldás szintés fos.
Kaz megoldása sztem ötletesebb.
SELECT DISTINCT
SUM(v.amt) as amt
FROM
(
SELECT
nt.number
FROM
(
SELECT
row_number() OVER (ORDER BY s1.name) as number
FROM
sysobjects s1
CROSS JOIN sysobjects s2) nt
WHERE nt.number < power(2, (select max(vid)+1 from Vouchers))
) n
INNER JOIN Vouchers v on (n.number & convert(int, (power(2, v.vid))) > 0)
GROUP BY n.number
Na pár html karaktert megevett az előző komment. Próbálom másképp küldeni.