Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

SQL-Sicht (mit berechneten Feldern in der gleichen Sicht weiterrechnen)

Begonnen von ellinho, März 05, 2012, 11:05:17

⏪ vorheriges - nächstes ⏩

ellinho

Hallo zusammen.
Ich hätte da mal eine grundlegende Frage :
In einer Sicht rechne ich mit zwei Tabellenfeldern z.B. dbo.Mitarbeiter.Stundenlohn*dbo.geleisteteStunden.Stunden AS Lohn ........
und möchte gerne in der gleichen Sicht mit dem soeben berechneten Feld "Lohn" weiterrechnen. z.B. Lohn-dbo.Vorschüsse.Vorschuss AS ausbezahlterBetrag........
Nach meinem bisherigen Verständnis muss ich dann immer die komplette Berechnung des Feldes, das eigentlich bereits berechnet wurde, wieder mit einbeziehen. In diesem Fall z.B. (dbo.Mitarbeiter.Stundenlohn*dbo.geleisteteStunden.Stunden)-dbo.Vorschüsse.Vorschuss AS ausbezahlter Betrag oder für die Errechnung des ausbezahlten Betrages eine neue Sicht erstellen.
Meine Frage :
Gibt es die Möglichkeit, mit bereits berechneten Feldern (wie z.B. hier das Feld "Lohn") in der Form Lohn-dbo.Vorschüsse.Vorschuss AS ausbezahlterBetrag weiterzurechnen ? Es ist ansonsten in einigen Sichten doch sehr kompliziert aufgebaut wenn eine sehr umfangreiche Berechnung eines Feldes mehrmals durchgeführt wird und sicherlich dann auch schlecht für die Performance und eigentlich sollte es doch möglich sein, viele Sachen in eine Sicht zu packen.

Gruß
Karsten

database

Hallo,

sieh mal hier....

Berechnungen und Aliase in Views

Bitsqueezer

Hallo Karsten,

ja, das geht, wenn man einfach CTEs einsetzt. In Common Table Expressions kann man Queries sozusagen staffeln, da kann man eine Menge mit machen. Beispiel:

WITH qryBerechnung AS
(
   SELECT Anzahl * Wert AS ZeilenSumme FROM Bestelldetails
    WHERE BestellID = 4711
), qryErgebnis AS
(
   SELECT ZeilenSumme, Artikelname, ZeilenSumme * 19 / 100 AS MwSt
     FROM qryBerechnung
)
SELECT * FROM qryErgebnis


Solche Verkettungen sind darüber hinaus auch sehr schnell, denn während qryBerechnung erst die ganze Tabelle einliest, um dann die ausgefilterten Datensätze zu entfernen und ein Ergebnisset zu bilden, kann die zweite Abfrage bereits auf die gefilterte Liste zugreifen. Wenn qryErgebnis jetzt auch noch weitere Filter setzen würde, hätte die letzte Abfrage dann wiederum noch weniger "zu tun".

Wenn Du einmal mit CTEs gearbeitet hast, willst Du sie nicht mehr missen. Man kann das gleiche auch mit verschachtelten Unterabfragen machen, ist aber bei weitem nicht so gut lesbar/wartbar.

Gruß

Christian

ellinho

Danke Christian für den Tipp.

Werde es bei Gelegenheit mal ausprobieren.


Gruß
Karsten

ellinho

Hallo Christian. Wie muss ich den Aufbau verstehen ? Ich rechne nun quasi im SELECT-Bereich der Sicht die ersten beiden Werte normal aus (Sollstundengesamt und Abwesenheitsstunden). Wenn ich jetzt als nächstes das Ergebnis der Sollstundennetto ausrechnen lassen möchte (Sollstundengesamt-Abwesenheitsstunden). Wie sähe dabei die Syntax aus ? Das habe ich noch nicht ganz verstanden ?

Gruß
Karsten

Bitsqueezer

Hallo,

wie in dem gezeigten Beispiel: die erste Abfrage liefert Sollstundengesamt und Abwesenheitsstunden und alle weiteren berechneten Spalten, die sich direkt aus den Feldern der Basistabelle/Abfrage berechnen lassen.
In der nächsten Abfrage beziehst Du Dich auf den Namen der ersten und hast damit alle Aliase aus der ersten Abfrage zur Verfügung und kannst damit nun weitere Berechnungen anstellen usw. Die gezeigte Verkettung verwendet zwei Abfragen und eine Gesamtabfrage am Schluß, das ist aber nur ein Beispiel, um zu zeigen, daß jede folgende Abfrage die vorhergehende(n) Abfragen verwenden kann (auch gemixt und gejoint natürlich). Es genügt aber auch eine einzige Abfrage mit einer Gesamtabfrage am Ende, das Beispiel sollte nur die mögliche Kaskadierung zeigen.

Gruß

Christian

ellinho

Hallo Christian.
Danke für Deine Ausführungen. Ehrlich gesagt ist mir die Geschichte zu kompliziert bei meinen umfangreichen Abfragen. Da bekomme ich die Syntax nicht hin. Habe es probiert, aber es hat leider nicht geklappt. Da bin ich wahrscheinlich zu viel Newbie. Habe es so gemacht wie bisher und setze das Thema mal auf gelöst, da Du den Lösungsansatz ja geliefert hast.
Danke nochmal.

Gruß
Karsten

Bitsqueezer

Hallo Karsten,

was ist daran kompliziert? Du hast eine Abfrage, die Spalten zurückliefert, ein paar davon berechnet. Jeder berechneten Spalte wird ein Alias zugewiesen. In der nächsten Abfrage in der CTE-Liste kannst Du nun auf diese Abfrage wie auf eine Tabelle mit deren Spalten und Spaltenaliasen zugreifen. Usw. mit jeder weiteren, denn Abfrage 2 kann wieder neue Aliase vergeben, die dann ab Abfrage 3 genutzt werden können usw.

Ohne Deine Abfrage gesehen zu haben, kann man Dir da auch nicht viel mehr zu sagen.

Gruß

Christian

ellinho

Danke Christian.

Habe es, wie gesagt, erst mal anders gemacht, da ich da nicht direkt durchgeblickt habe.
Werde mich aber in einer ruhigen Minute mal damit befassen. Bin leider noch nicht dazu gekommen.

Gruß
Karsten