Einzelnen Beitrag anzeigen

nahpets
(Gast)

n/a Beiträge
 
#8

Re: View, Stored Procedure oder doch Abfrage?

  Alt 8. Mai 2009, 15:04
Hallo,

View draus machen:
SQL-Code:
create view DasIstAberGanzSchoenVielSQLOderSo as
select rechnungsdatum, rechnungsnummer, kunde, waehrung,
round(sum(case when typ='WAREthen wert else 0 end)) as [ware],
round(sum(case when typ='VERPACKUNGthen wert else 0 end)) as [verpackung],
..., mwst_einfach, mwst_voll, sum([ware] + ... + mwst_voll) as [brutto]
from
(select rechnungsdatum, rechnungsnummer, kunde, waehrung, typ, waehrung, wert, (wert * mwst), mwstart
from
(select rechnungsdatum, rechnungsnummer, kunde, waehrung, waehrung, 'WAREas [typ],
sum(einheiten * preis + ... + case when irgendwas then ... else ... end) as [wert]
from auftrag
where ...irgendwas...
group by ...

union

select rechnungsdatum, rechnungsnummer, kunde, waehrung, waehrung, 'VERPACKUNG',
sum(einheiten * preis + ... + case when irgendwas then ... else ... end)
from auftrag
where ...irgendwas...
group by ...

union
...insgesamt 8x...
)
where wert <> 0
) subalias2
group by firma, rechnungsdatum, rechnungsnummer, kunde, waehrung
order by firma, rechnungsdatum, rechnungsnummer
Abfrage sähe dann so aus:
SQL-Code:
Select * from DasIstAberGanzSchoenVielSQLOderSo
where printdate >= convert(:vondatum, sql_date)
and printdate <= convert(:bisdatum, sql_date)
and firma = :fma
wenn:
where ...irgendwas... nicht variabel ist.

Bei genauerem Detailwissen zu dem Aufbau Deines SQL's könnte man eventuell auch noch entscheiden, ob der 8x vorkommende Block nicht auch in eine View ausgelagert wird und dann zur Laufzeit ein Konstrukt wie
SQL-Code:
select 'VERPACKUNG', * from AchtMalView
where 'die Einschränkung' = 'für Verpackung ist'
benutzt werden könnte.
SQL-Code:
select rechnungsdatum, rechnungsnummer, kunde, waehrung,
round(sum(case when typ='WAREthen wert else 0 end)) as [ware],
round(sum(case when typ='VERPACKUNGthen wert else 0 end)) as [verpackung],
..., mwst_einfach, mwst_voll, sum([ware] + ... + mwst_voll) as [brutto]
from
(select rechnungsdatum, rechnungsnummer, kunde, waehrung, typ, waehrung, wert, (wert * mwst), mwstart
from
select 'VERPACKUNG', * from AchtMalView where 'die Einschränkung' = 'für Verpackung ist'
union
select 'WARE', * from AchtMalView where 'die Einschränkung' = 'für Ware ist'
union
... und noch die übrigen ...
)
group by firma, rechnungsdatum, rechnungsnummer, kunde, waehrung
order by firma, rechnungsdatum, rechnungsnummer
Auch hieraus ließe sich noch eine View machen, auf die dann per
SQL-Code:
Select * from
where printdate >= convert(:vondatum, sql_date)
and printdate <= convert(:bisdatum, sql_date)
and firma = :fma
zugegriffen wird. Je nach Komplexität der mehrfachvorkommenden Union-Teiles kann das die Wartung deutlich vereinfachen. Es muss dann nicht mehr in jedem Union-Teil geändert werden, sondern nur noch einmal in der entsprechenden View.

Das kann man aber letztlich nur bei vollständiger Kenntnis der Abfrage sinnvoll entscheiden.
  Mit Zitat antworten Zitat