die erweiterung die Firebird da kann sind auf jeden Fall ein Weg, wie man das umsetzen
kann, ist aber nicht immer intuitiv für alte säcke (wie mich) zu verstehen, daher geht das
wenn ich das richtig verstanden hab auch so (beispiel auf basis der ibexpert demodb db1)
Code:
select CATEGORY.TXT,
(select sum(X_PRICE)
from (select first 10 X_PRODUCT.PRICE X_PRICE
from PRODUCT X_PRODUCT
where X_PRODUCT.CATEGORY_ID = CATEGORY.ID
order by PRICE desc))
from category
wie komm ich da drauf?
1. im inneren select willst du immer nur die 10 höchsten records haben
Code:
select first 10 X_PRODUCT.PRICE X_PRICE
from PRODUCT X_PRODUCT
order by X_PRODUCT.PRICE desc
eine alias benutze ich da schon damit diese eben dann später mit den äußeren selects nix durcheinander kommt
2. du brauchst die gruppierte summe der 10 records also ermittelst du nur die summe zur gruppe, die kommt dann gleich von einem noch drumherum liegenden äußeren select
Code:
select sum(X_PRICE)
from (select first 10 X_PRODUCT.PRICE X_PRICE
from PRODUCT X_PRODUCT
where X_PRODUCT.CATEGORY_ID = CATEGORY.ID
order by PRICE desc))
3. und das jeweils zeilenweise als spaltenwert ermitteln für jede gruppe
Code:
select CATEGORY.TXT,
(select sum(X_PRICE)
from (select first 10 X_PRODUCT.PRICE X_PRICE
from PRODUCT X_PRODUCT
where X_PRODUCT.CATEGORY_ID = CATEGORY.ID
order by PRICE desc))
from category
fazit: subselects sind wenn indiziert zugegriffen wird, auch schon sehr hilfreich, es ginge auch per execute block mit zwischenvariablen
aber ganz wichtig: das was ich da oft bei kunden sehe sind subselects auf prozeduren und damit nie indiziert, es sei denn die sp ist dafür
schon brauchbar definiert, das wird dann oft extrem performancekritisch. Oder ganz einfach: wenn so ein
SQL dann bei euch sehr lang braucht
liegt das nicht an Firebird, sondern an eurer mieserablen Implementation, an der man aber immer was optimieren kann, ohne gleich alles
über den haufen zu werfen.