Hi nette Profis, kann ich diese Abfrage Optimieren

Hi Biber, dieser verhindert mehr als eine WH, ich muss diesen jetzt ändern so das ich diesmal die mehr als eine WH bekomme
SQL:
 AND (
             SELECT COUNT(lpp.bezeichnung)
              FROM davidw2000._kde_leistpruefungpraxis As lpp
        INNER JOIN davidw2000._kde_leist AS kdl ON lpp.id_kdleist = kdl.id_kdleist
             WHERE lpp.bezeichnung IN ('WH Praxis','WH Prüfung')
               AND kdl.id_kd=lkde.id_kd) = 1   
            THEN 1
 ELSE 0 END) AS PpAz_2_B,[sql]

Diese mehrfachen Wh-Prüfungen
- haben doch wohl nicht den id_prstatus=1, von dem ich annahm, er bedeutet 'bestanden'?
Bestandene Prüfung bekommt den prstatus=1 nicht bestandene prstatus=2 oder auch WH Prüf bekommt den prstatus=1 wenn bestanden wird, diese kann auch nach 10 Prüfungen den prstatus=1 bekommen, da dieses dann unter 2.bestandene WH Prüf erscheint, wird der FL auch für diese 10 te WH prüf belohnt, soll er aber nicht, deswegen darf nur eine WH Prüf unter 2. Bestandene Prüf angezeigt werden, 2. und weitere WH Prüfungen sollen unter Erfolglose Prüfungen aufgelistet werden.
Ohne COUNT(WH Prüf) weiss ich aber nicht wieviele WHs gefahren sind.

-Prüfung mit prstatus=1 geht nur einmal, weitere Prüfungen werden immer als WH Prüf gespeichert
bei den Prüfungen prstatus=1 oder 2 gibt es keine probleme, Probleme gibt es bei WH Prüfung, diese müssen gezählt werden

Kann es sein das das Datum, also der Zeitraum den ich eingebe verhindert das alle WHs gezählt werden? ich gehe mal davon aus das nur die WHs im angegebenen Zeitraum gesucht werden, da es das nicht immer gibt, bekomme ich nicht das richtige Ergebnis, meine Frage kann ich den eigentlich verhindern das das Datum (Zeitraum den ich Eingebe) für den COUNT() der gesammt WHs eines Kunden kein Einfluss auf den Count() hat, hier im Inneren SELECT soll sich das Datum nicht einmischen, denke das ist das problem

SQL:
/* Anfang alle Erfolglose Praxis Prüfung*/

  SUM(CASE WHEN lppru.isUnterschrift = True
            AND lppru.bezeichnung IN ('Praxis','Prüfung','WH Praxis','WH Prüfung')
      AND lppru.id_prstatus = 2 
    AND 
         (SELECT COUNT(lpp.bezeichnung)
                  FROM davidw2000._kde_leistpruefungpraxis As lpp
            INNER JOIN davidw2000._kde_leist AS kdl ON lpp.id_kdleist = kdl.id_kdleist
                 WHERE lpp.bezeichnung IN ('WH Praxis','WH Prüfung')
                   AND kdl.id_kd=lkde.id_kd ) = 1
            THEN 1
 ELSE 0 END) AS PpAz_0,
[sql]

Mit FlySpeed SQL Query Software zusammengestellt, wenn ich diese Integriere geht's trotzdem nicht, , deswegen der Gedanke mit dem Datum, sollte also unabhängig vom Datum zählen.

SQL:
SELECT
  Count(davidw2000._kde_leistpruefungpraxis.bezeichnung) AS Anzahl
FROM
  davidw2000._kde_leistpruefungpraxis
  INNER JOIN davidw2000._kde_leist ON davidw2000._kde_leist.id_kdleist = davidw2000._kde_leistpruefungpraxis.id_kdleist
WHERE
  davidw2000._kde_leistpruefungpraxis.bezeichnung IN ('WH Praxis', 'WH Prüfung') AND
  davidw2000._kde_leist.id_kd = davidw2000._kde_leist.id_kd
  GROUP BY
  davidw2000._kde_leist.id_kd
[sql]
 
Zuletzt bearbeitet von einem Moderator:
Moin Technic1965,

mach doch mal nur den SELECT auf den o.g. Join für diese id_kd 1331 mit den 4 Wh-Prüfungen, dann sehen wir doch vielleicht das Problem.

Grüße
Biber
 
Hi,
habe mal geprüft.
-Datum darf bei der COUNT() der WHs keine Bedingung sein,
-Mitarbeiter nummer darf bei der COUNT() der WHs keine Bedingung sein,
-Bezeichnung nur WH Praxis und WH Prüfung (muss),
Nur eine zählen geht, kdl.id_kd = 1331 aber wenn
kdl.id_kd = kdl.id_kd dann Problem mit Subquery meherere Row,
nach kdl.id_kd Gruppieren muss auch , sonst bekommt man alle WHs die in der DB sind, dann sind das über 300 WHs, schafft keiner :)
Wie schaffe ich das nur die Kunden WHs gezählt werden, in dem angegegeben Zeitraum, die WH (Prüfung oder Praxis) id_prstatus=1 bekommen haben, es kann auch sein das mehrer WHs am gleichen Tag stattfinden, also wichtig die anzahl der Prüflinge mit mehr als eine WH an dem tag.
Also benötige ich die Anzahl der Prüflinge an dem tag wo WH id_prstatus = 1 gesetzt ist.
Benötige Anzahl der >1 und <2 Prüfling Anzahl

SQL:
 CASE WHEN
            (SELECT Count(lpp.bezeichnung)
             FROM
                 davidw2000._kde_leistpruefungpraxis AS lpp
             INNER JOIN davidw2000._kde_leist AS kdl ON lpp.id_kdleist = kdl.id_kdleist
             WHERE
                 lpp.bezeichnung IN ('WH Praxis', 'WH Prüfung') AND
                 kdl.id_kd = 1331
             GROUP BY
                  kdl.id_kd) > 1                 
             Then    
                  'mehr als eine WH'
     ELSE 'eine WH'
    END AS PAZ,
[sql]
 
Moin Technic1965,

sorry, das bekomme ich ohne ein paar Blicke auf die Daten nicht hin, da ich auch nicht alle deine Schlussfolgerungen aus dem letzten Kommentar teile.

Meine Sichtweise:
Zu dem Zeitpunkt, an dem das CASE WHEN.. zur Ermittlung der PAZ (das Feld interpretierier ich als "nicht bestandene Wh-Prüfungen an diesem Tag") ausgeführt wird, hast du einen virtuellen Datensatz in Arbeit, der
- sich auf einen bestimmten Tag bezieht (=lsdate kennen wir)
- sich auf einen bestimmten Prüfling bezieht ( =id_kd kennen wir)
- und der eine WH-Prüfung ist ( wissen wir, weil "bezeichnung IN ('WH Praxis', 'WH Prüfung')" oder "substr(bezeichnung, 1, 3)='WH '")
- WENN jetzt der pr_status=2 ist ("nicht bestanden"), dann sollte es als Wh-Prüfung gezählt werden , WENN...
- (jetzt meine Unsicherheit): NUR WENN es für diese id_kd auch einen WH-Prüf-Datensatz gibt mit prstatus=1 und lsdate>=aktuelles lsdate?
Das könnten wir mit einer weiteren AND EXISTS-Bedingung im Where hinkriegen, denke ich.

Aber ich muss es erst fachlich verstehen, und da fehlen mir ein paar Puzzleteile.

Beispiel: du machst eine Auswertung für den Juni und am 17.6. war für id_kd 4711 eine nicht bestandene Prüfung (id_prstatus=2).
Fall a) Nachgeholt und bestanden hat der Prüfling diese Prüfung am 9.August. Zählt der Datensatz am 17.6 oder nicht?
Fall b) Nachgeholt und bestanden hat der Prüfling diese Prüfung noch nie. Zählt das am 17.6 oder nicht?
Fall c) ist der einzge, den ich glaube, richtig zu verstehen: Versemmelte Prüfung am 17.6 zählt in der Juni-Auswertung, wenn auch im Juni nachgeholt und bestanden.

Ggf. müssen wir mal über PN/Mail Datails austauschen, bevor wir hier die anderen langweilen.

Grüße
Biber
 
sorry, das bekomme ich ohne ein paar Blicke auf die Daten nicht hin, da ich auch nicht alle deine Schlussfolgerungen aus dem letzten Kommentar teile.
Kann ich verstehen, ohne DB zu arbeiten ist schon respektvoll, möchte nicht behaupte, ich lerne mit deiner Hilfe auch mit.

Beispiel: du machst eine Auswertung für den Juni und am 17.6. war für id_kd 4711 eine nicht bestandene Prüfung (id_prstatus=2).
Fall a) Nachgeholt und bestanden hat der Prüfling diese Prüfung am 9.August. Zählt der Datensatz am 17.6 oder nicht?
Fall b) Nachgeholt und bestanden hat der Prüfling diese Prüfung noch nie. Zählt das am 17.6 oder nicht?
erst wenn der Kunde bestanden hat, also id_prstatus=1 ist, dann soll auf anzahl der Gefahrenen WH Prüfungen gezählt werden, Prüfungen oder Praxis(keine WH) brauchen nicht zu zählen, unwichtig

SQL:
 SUM(CASE WHEN   lppru.bezeichnung IN ('WH Praxis','WH Prüfung','Praxis','Prüfung')
                   AND lppru.id_prstatus = 2
                   AND lppru.isUnterschrift = True
           THEN 1

 ELSE 0 END)  AS pruefungen_mit_bezeichnung_WH Praxis_und_WH Prüfung_und_Praxis_und_Prüfung_fuer die Id_prstatus=2_gesetzt ist_hier_auflisten


 SUM(CASE WHEN (SELECT COUNT(lpp.bezeichnung)
                  FROM davidw2000._kde_leistpruefungpraxis As lpp
            LEFT JOIN davidw2000._kde_leist AS kdl ON lpp.id_kdleist = kdl.id_kdleist
                 WHERE lpp.bezeichnung IN ('WH Praxis','WH Prüfung')
                   AND lpp.isUnterschrift = True
                   AND lpp.id_prstatus = 1
                   AND kdl.id_kd=lkde.id_kd) > 1  
                  THEN  1           
 ELSE 0 END) AS bestandene_WH_mit mehr_als_einen_Versuch_also_2_und_mehr_WHs_sollen_hier_angezeigt_werden_wenn_fuer_WH_status=1_gesetzt_ist
 
pruefungen_mit_bezeichnung_WH Praxis_und_WH Prüfung_und_Praxis_und_Prüfung_fuer die Id_prstatus=2_gesetzt ist_hier_auflisten
      (+)
bestandene_WH_mit mehr_als_einen_Versuch_also_2_und_mehr_WHs_sollen_hier_angezeigt_werden_wenn_fuer_WH_status=1_gesetzt_ist= erfolglose_prüfungen
[sql]

ich glaube ich muss über PN die wichtigen teile der DB mit dir teilen, namen kann ich rausnehmen, zahlen sind unwichtig, sonst schaffe ich das nicht :( ich glaube ich sehe vor lauter Bäumen, den Wald nicht.
 
Zuletzt bearbeitet von einem Moderator:
Moin Tecnhnic1965,

also, nach den letzten Klärungen, was wie wann gezählt werden soll, müssten doch die Bindungen in SQL übersetzt so lauten:
SQL:
...
, SUM(CASE WHEN   lppru.bezeichnung IN ('WH Praxis','WH Prüfung','Praxis','Prüfung')
                   AND lppru.id_prstatus = 2
                   AND lppru.isUnterschrift = TRUE
        THEN 1
        ELSE 0 END)  AS PruefungNichtBestanden
   /* pruefungen_mit_bezeichnung_WH Praxis_und_WH Prüfung_und_Praxis_und_Prüfung_fuer die Id_prstatus=2_gesetzt ist_hier_auflisten */
 , SUM(CASE WHEN lppru.bezeichnung IN ('WH Praxis','WH Prüfung') /* Wiederholprüfung */
            AND lppru.id_prstatus = 1  /* bestanden... */
            AND lppru.isUnterschrift = TRUE /* ...und bestätigt */
            AND Exists (SELECT 1
                  FROM davidw2000._kde_leistpruefungpraxis AS lpp
             LEFT JOIN davidw2000._kde_leist AS kdl ON lpp.id_kdleist = kdl.id_kdleist
                 WHERE lpp.bezeichnung IN ('WH Praxis','WH Prüfung')
                   AND lpp.isUnterschrift = TRUE
                   AND lpp.id_prstatus = 2 /* nicht bestanden */
                   AND kdl.id_kd=lkde.id_kd)    /* es gibt mindestens   eine nicht bestandene Wh-Prüfung */
                  THEN  1        
          ELSE 0 END) AS MehrfachWHbestanden
      /* bestandene_WH_mit_mehr_als_einem_Versuch,also 2 und mehr WHs_sollen_hier_angezeigt_werden_wenn_fuer_WH_status=1_gesetzt_ist */
   ...

Wenn da immer noch nicht das Gewünschte herauskommt, dann wäre IMHO das Sinnvollste, einen SELECT zu machen der Form...
SQL:
SELECT *
                  FROM davidw2000._kde_leistpruefungpraxis AS lpp
             LEFT JOIN davidw2000._kde_leist AS kdl ON lpp.id_kdleist = kdl.id_kdleist
lpp.bezeichnung IN ('WH Praxis','WH Prüfung','Praxis','Prüfung')
Order BY kdl.lsdate
..., diese 300 Datensätze in eine Exceltabelle zu kopieren und mit dieser Datengrundlage die Fälle durchzuspielen.
300 Datensätze ist jetzt nicht sooo viel, aber sollte doch die meisten in der Realität vorkommenden Konstellationen beinhalten.

Grüße
Biber
 
  • ...
  • , SUM(CASE WHEN lppru.bezeichnung IN ('WH Praxis','WH Prüfung','Praxis','Prüfung')
  • AND lppru.id_prstatus = 2
  • AND lppru.isUnterschrift = TRUE
  • THEN 1
  • ELSE 0 END) AS PruefungNichtBestanden
  • /* pruefungen_mit_bezeichnung_WH Praxis_und_WH Prüfung_und_Praxis_und_Prüfung_fuer die Id_prstatus=2_gesetzt ist_hier_auflisten */
  • , SUM(CASE WHEN lppru.bezeichnung IN ('WH Praxis','WH Prüfung') /* Wiederholprüfung */
  • AND lppru.id_prstatus = 1 /* bestanden... */
  • AND lppru.isUnterschrift = TRUE /* ...und bestätigt */
  • AND EXISTS (SELECT 1
  • FROM davidw2000._kde_leistpruefungpraxis AS lpp
  • LEFT JOIN davidw2000._kde_leist AS kdl ON lpp.id_kdleist = kdl.id_kdleist
  • WHERE lpp.bezeichnung IN ('WH Praxis','WH Prüfung')
  • AND lpp.isUnterschrift = TRUE
  • AND lpp.id_prstatus = 2 /* nicht bestanden */
  • AND kdl.id_kd=lkde.id_kd) /* es gibt mindestens eine nicht bestandene Wh-Prüfung */
  • THEN 1
  • ELSE 0 END) AS MehrfachWHbestanden
  • /* bestandene_WH_mit_mehr_als_einem_Versuch,also 2 und mehr WHs_sollen_hier_angezeigt_werden_wenn_fuer_WH_status=1_gesetzt_ist */
  • ...
Perfekt, komentar folgt :)

  • SUM(CASE WHEN lppru.bezeichnung IN ('WH Praxis','WH Prüfung','Praxis','Prüfung')
  • AND lppru.id_prstatus = 2
  • AND lppru.isUnterschrift = TRUE
  • THEN 1
  • ELSE 0 END) AS PruefungNichtBestanden
diese listet alle Prüfungen mit Status 2
  • SUM(CASE WHEN lppru.bezeichnung IN ('WH Praxis','WH Prüfung') /* Wiederholprüfung */
  • AND lppru.id_prstatus = 1 /* bestanden... */
  • AND lppru.isUnterschrift = TRUE /* ...und bestätigt */
  • AND EXISTS (SELECT 1
  • FROM davidw2000._kde_leistpruefungpraxis AS lpp
  • LEFT JOIN davidw2000._kde_leist AS kdl ON lpp.id_kdleist = kdl.id_kdleist
  • WHERE lpp.bezeichnung IN ('WH Praxis','WH Prüfung')
  • AND lpp.isUnterschrift = TRUE
  • AND lpp.id_prstatus = 2 /* nicht bestanden */
  • AND kdl.id_kd=lkde.id_kd) /* es gibt mindestens eine nicht bestandene Wh-Prüfung */
  • THEN 1
  • ELSE 0 END) AS MehrfachWHbestanden

diese hier bringt mir alle bestandenen WHs mit prstatus=1, die mehr als eine WH hat, problemlos :)
 
Zuletzt bearbeitet von einem Moderator:
Moin Technic1965,

na, vielleicht haben wir dann ja endlich diese Kuh vom Eis. ;)

Gottseidank hatte ich noch ein Bierchen im Haus... das gönn' ich mir zur Feier des Tages.

Es bleiben in der Reihenfolge der Dringlichkeit noch folgende Restarbeiten offen:

Prio 1: Diese Frage auf "Erledigt" setzen (wenn es endlich hinreichend beantwortet ist... toi toi toi)
Prio 2: Das vorläufig amtliche Arbeitsendergebnis einmal im Stück posten, damit spätere MitleserInnen nicht die ganzen Bruchstücke, Ausschnitte, Irrungen und Wirrungen hier durchkaspern müssen.

Danach optional, eventuell und mit frei wählbarer Priorität noch zwei lose Enden:

- Performanz/Laufzeit/Tuning/ ünterstützende Indizes etc
Wir haben jetzt nur die reine Soll-Funktionalität umgesetzt und alles Andere vollkommen ausgeblendet:
So KANN man zwar vorgehen, aber das solltest du nicht. "Hauptsache es funktioniert" ist auch bei SQL-Statements nicht das richtige Qualitätskriterium.
- Lesbarkeit/Wartbarkeit
Hatten wir mal zwischendurch gestreift und da hatte ich es erstmal verschoben.
Sinnvoll wäre es aber schon, einen Teil der Logik in Views zu verlagern und diese inzwischen doch mehrzeilige Abfrage zu verschlanken. Denn es wirkt ja schon durchaus viel komplexer als es eigentlich ist, weil wir Summierung und Pivotierung in _einer_ Abfrage machen und dabei für jedes Ergebnisfeld der Auswertung ein verschurbeltes CASE WHEN THEN-Gedöns tippseln.

Egal, die beiden optionalen losen Enden müssen wir nicht unbedingt hier im Forum behandeln.
Aber die Prio 1+2-Punkte solltest du noch erledigen.

Grüße
Biber
 
Zuletzt bearbeitet:
na, vielleicht haben wir dann ja endlich diese Kuh vom Eis. ;)
die Kuh ist noch nicht vom Eis, es gibt noch einiges für diesen Teil zu erledigen,

Gottseidank hatte ich noch ein Bierchen im Haus... das gönn' ich mir zur Feier des Tages.
Das Bier ist das kleinste Problem, schicke dir Paar Kisten rüber, aber wohin, bist du bei der NASA, mühe muss belohnt werden, dazu noch wenn man sein Wissen dabei erweitert (ich)

Prio 1: Diese Frage auf "Erledigt" setzen (wenn es endlich hinreichend beantwortet ist... toi toi toi)
Prio 2: Das vorläufig amtliche Arbeitsendergebnis einmal im Stück posten, damit spätere MitleserInnen nicht die ganzen Bruchstücke, Ausschnitte, Irrungen und Wirrungen hier durchkaspern müssen.
Prio 1: Diese Frage auf "Erledigt" setzen (wenn es endlich hinreichend beantwortet ist... toi toi toi)
Prio 2: Das vorläufig amtliche Arbeitsendergebnis einmal im Stück posten, damit spätere MitleserInnen nicht die ganzen Bruchstücke, Ausschnitte, Irrungen und Wirrungen hier durchkaspern müssen.
Werde ich auf jeden Fall machen, wenn der Rest erledigt ist, kann ja auch wenn du magst den jetzigen Teil Posten

Danach optional, eventuell und mit frei wählbarer Priorität noch zwei lose Enden:

- Performanz/Laufzeit/Tuning/ ünterstützende Indizes etc
Wir haben jetzt nur die reine Soll-Funktionalität umgesetzt und alles Andere vollkommen ausgeblendet:
So KANN man zwar vorgehen, aber das solltest du nicht. "Hauptsache es funktioniert" ist auch bei SQL-Statements nicht das richtige Qualitätskriterium.
- Lesbarkeit/Wartbarkeit
Hatten wir mal zwischendurch gestreift und da hatte ich es erstmal verschoben.
Sinnvoll wäre es aber schon, einen Teil der Logik in Views zu verlagern und diese inzwischen doch mehrzeilige Abfrage zu verschlanken. Denn es wirkt ja schon durchaus viel komplexer als es eigentlich ist, weil wir Summierung und Pivotierung in _einer_ Abfrage machen und dabei für jedes Ergebnisfeld der Auswertung ein verschurbeltes CASE WHEN THEN-Gedöns tippseln.
was noch zu tun ist,
1. Stundenlöhne muss ich noch abrufen für jede Klasse
2. wir haben alles nach Tag aufgelistet, diese muss ich jetzt für den erwünschten Zeitraum zusammenrechnen und , auch aufgeteilt je Leistung, Prüfanzahl und so
3. was noch sehr wichtig ist, die durchschnittliche Tagesarbeitszeit der Arbeitstage der letzten 13 Wochen, denn wenn Krank oder Urlaub muss ich den Durchschnitt nehmen.
4. erst wenn komplett fertig, ist meine bitte auf Performanz, Schnelligkeit und natürlich Lesbarkeit zu Prüfen.
Sollte ich dieses Thema trotzdem schließen? Ich denke es ist aber für mich noch nicht fertig.

Grüße Technic

Hi Biber,
Bei mir geht es weiter, jetzt müssen die Std.Löhne rein, habe vier als Beispiel reingesetzt, 7 werden es bestimmt, kann aber bis 15 unterschiedliche Klassen erweitert werden, ich muss ja auch lernen weniger zu tippen oder :)
SQL:
   (SELECT
  davidw2000._mtbl_flverguetung.prpreis
FROM
  davidw2000._ctbl_fahrzeuge
  INNER JOIN davidw2000._mtbl_flverguetung ON davidw2000._mtbl_flverguetung.id_fznr = davidw2000._ctbl_fahrzeuge.id_fznr
  INNER JOIN davidw2000._mtbl_bruttolohnliste ON davidw2000._mtbl_bruttolohnliste.id_nrblist =
    davidw2000._mtbl_flverguetung.id_nrblist
  INNER JOIN davidw2000._mtbl_stammdaten ON davidw2000._mtbl_stammdaten.id_nrblist =
    davidw2000._mtbl_bruttolohnliste.id_nrblist
  INNER JOIN davidw2000._sys_klasse ON davidw2000._sys_klasse.id_fsklnr = davidw2000._mtbl_flverguetung.id_fsklnr
WHERE
  davidw2000._ctbl_fahrzeuge.status = 1 AND
  davidw2000._mtbl_stammdaten.id_mitar = x.id_nrmitar AND
  davidw2000._sys_klasse.klasse = 'B'
  GROUP BY
davidw2000._sys_klasse.klasse)  AS Verg_B, 

   (SELECT
  davidw2000._mtbl_flverguetung.prpreis
FROM
  davidw2000._ctbl_fahrzeuge
  INNER JOIN davidw2000._mtbl_flverguetung ON davidw2000._mtbl_flverguetung.id_fznr = davidw2000._ctbl_fahrzeuge.id_fznr
  INNER JOIN davidw2000._mtbl_bruttolohnliste ON davidw2000._mtbl_bruttolohnliste.id_nrblist =
    davidw2000._mtbl_flverguetung.id_nrblist
  INNER JOIN davidw2000._mtbl_stammdaten ON davidw2000._mtbl_stammdaten.id_nrblist =
    davidw2000._mtbl_bruttolohnliste.id_nrblist
  INNER JOIN davidw2000._sys_klasse ON davidw2000._sys_klasse.id_fsklnr = davidw2000._mtbl_flverguetung.id_fsklnr
WHERE
  davidw2000._ctbl_fahrzeuge.status = 1 AND
  davidw2000._mtbl_stammdaten.id_mitar = x.id_nrmitar AND
  davidw2000._sys_klasse.klasse = 'A'
  GROUP BY
davidw2000._sys_klasse.klasse)  AS Verg_A,

   (SELECT
  davidw2000._mtbl_flverguetung.prpreis
FROM
  davidw2000._ctbl_fahrzeuge
  INNER JOIN davidw2000._mtbl_flverguetung ON davidw2000._mtbl_flverguetung.id_fznr = davidw2000._ctbl_fahrzeuge.id_fznr
  INNER JOIN davidw2000._mtbl_bruttolohnliste ON davidw2000._mtbl_bruttolohnliste.id_nrblist =
    davidw2000._mtbl_flverguetung.id_nrblist
  INNER JOIN davidw2000._mtbl_stammdaten ON davidw2000._mtbl_stammdaten.id_nrblist =
    davidw2000._mtbl_bruttolohnliste.id_nrblist
  INNER JOIN davidw2000._sys_klasse ON davidw2000._sys_klasse.id_fsklnr = davidw2000._mtbl_flverguetung.id_fsklnr
WHERE
  davidw2000._ctbl_fahrzeuge.status = 1 AND
  davidw2000._mtbl_stammdaten.id_mitar = x.id_nrmitar AND
  davidw2000._sys_klasse.klasse = 'A2'
  GROUP BY
davidw2000._sys_klasse.klasse)  AS Verg_A2, 

   (SELECT
  davidw2000._mtbl_flverguetung.prpreis
FROM
  davidw2000._ctbl_fahrzeuge
  INNER JOIN davidw2000._mtbl_flverguetung ON davidw2000._mtbl_flverguetung.id_fznr = davidw2000._ctbl_fahrzeuge.id_fznr
  INNER JOIN davidw2000._mtbl_bruttolohnliste ON davidw2000._mtbl_bruttolohnliste.id_nrblist =
    davidw2000._mtbl_flverguetung.id_nrblist
  INNER JOIN davidw2000._mtbl_stammdaten ON davidw2000._mtbl_stammdaten.id_nrblist =
    davidw2000._mtbl_bruttolohnliste.id_nrblist
  INNER JOIN davidw2000._sys_klasse ON davidw2000._sys_klasse.id_fsklnr = davidw2000._mtbl_flverguetung.id_fsklnr
WHERE
  davidw2000._ctbl_fahrzeuge.status = 1 AND
  davidw2000._mtbl_stammdaten.id_mitar = x.id_nrmitar AND
  davidw2000._sys_klasse.klasse = 'A1'
  GROUP BY
davidw2000._sys_klasse.klasse)  AS Verg_A1,[sql]
 
Zuletzt bearbeitet von einem Moderator:
Moin Technic1965,

hm, du musst aber bedenken: die meisten potentiell Hilfswilligen hier im Forum haben weder Fahrschul-Datenbank entwicklelt noch kennen sie die fachlichen Zusammenhänge.

Anhand der Tabellen- und Feldnamen sowie der Tabellenbeziehungen in deinen Statements kann natürlich ein halbwegs gut ausgebildeter Datenbank-Archäologe oder Sourcecode-Restaurator das eine oder andere gedanklich reverse engineeren....
-> Aber nicht alles.

Ein bisschen was musst du erklären, z.B. was denn dieser _mtbl_flverguetung.prpreis ist/aussagt.
Dann werden bestimmt auch andere mithelfen - es soll ja kein einsamer Dialog zwischen uns beiden bleiben.

Okay, anders gefragt:

Bisher haben wir in inneren SELECT mit dem Alias x, da wo wir die die nötigen Detailsätze in der Hand und diese noch nicht tageweise zusammenngefasst haben, dort haben wir aus welchen Tabellen/Joins auch immer unter anderem

- das Datum/den Tag
- den Mitarbeiter "id_nrmitar"
- auch (falls es eine Praxis-Leistung ist) die "id_fsklnr"

So, das hiesse für mich doch - wenn der Fahrlehrer Nr 5 an einem bestimmten Tag seinem Prüfling eine Moped-Stunde erteilt hat, dann erkennen wir das (hat eine bestimmte id_fsklnr) und für diese id_fsklnr+diesen Mitarbeiter sind Std-Löhne hinterlegt und an diese Info könnte man kommen.
Das wäre mein Vorgehen bei einer Tagesauswertung.

Was ich NICHT verstehe: was zeigst du denn bisher bzw mit dem geposteten SQL-Fragment an?
Weil ... in deinen SQL-Schnipseln im letzten Kommentar sehe ich zwar den Bezug zu dem id_mitarbeiter , nach "sys_klasse.klasse" zusammengefasst...
Aber ich sehe keinen Bezug zum aktuellen Tag oder den tatsächlichen Leistungen , die ermittelt wurden (im Beispiel die Moped-Stunde)
Das verwirrt mich.

Steht bei dir laut Plan für jeden Tag/jede Zeile der Auswertung der gleiche Wert "_mtbl_flverguetung.prpreis" in deiner Auswertung in so einer Spalte "Verg_A", "Verg_B" usw.?


Grüße
Biber
 
Hi Biber,

bin wieder dabei, immer noch am glichen Werk, eine Frage hierzu, kann ich hier eigentlich sparsamer mit der Tastatur umgehen oder muss das so sein? muss mehrere davon hintereinander reihen.
Grüße Technic
SQL:
   CASE WHEN 
            (SELECT mFvg.prpreis
                  FROM davidw2000._mtbl_stammdaten AS Sdat
            INNER JOIN davidw2000._mtbl_bruttolohnliste AS mBtl ON Sdat.id_nrblist = mBtl.plnummer
            INNER JOIN davidw2000._mtbl_flverguetung AS mFvg ON mBtl.id_nrblist = mFvg.id_nrblist
            INNER JOIN davidw2000._sys_klasse AS FeK ON FeK.id_fsklnr = mFvg.id_fsklnr
            INNER JOIN davidw2000._ctbl_fahrzeuge AS Fzg ON mFvg.id_fznr = Fzg.id_fznr
            INNER JOIN davidw2000._sys_leistungsarten AS lart ON lart.id_lsartnr = mFvg.id_lsartnr
                 
       WHERE FeK.klasse = 'B'
       AND Sdat.id_mitar = x.id_nrmitar
                   AND mBtl.plstatus = 1
                   AND lart.id_lsartnr IN (
                             SELECT lart.id_lsartnr
                                             FROM _sys_leistungsarten AS lart
                                            WHERE lart.abk IN ('Üst', 'ÜL', 'AB', 'NF', 'Uw', 'FV', 'Pf')
                )
             AND Fzg.id_fznr IN (
                           SELECT Fzg.id_fznr
                                         FROM _ctbl_fahrzeuge AS Fzg
                                        WHERE FeK.klasse = 'B'
                AND Fzg.status = 1
             )
                                     GROUP BY FeK.klasse) > 1
 THEN 
            (SELECT mFvg.prpreis
                  FROM davidw2000._mtbl_stammdaten AS Sdat
            INNER JOIN davidw2000._mtbl_bruttolohnliste AS mBtl ON Sdat.id_nrblist = mBtl.plnummer
            INNER JOIN davidw2000._mtbl_flverguetung AS mFvg ON mBtl.id_nrblist = mFvg.id_nrblist
            INNER JOIN davidw2000._sys_klasse AS FeK ON FeK.id_fsklnr = mFvg.id_fsklnr
            INNER JOIN davidw2000._ctbl_fahrzeuge AS Fzg ON mFvg.id_fznr = Fzg.id_fznr
            INNER JOIN davidw2000._sys_leistungsarten AS lart ON lart.id_lsartnr = mFvg.id_lsartnr
                 
       WHERE FeK.klasse = 'B'
       AND Sdat.id_mitar = x.id_nrmitar
                   AND mBtl.plstatus = 1
                   AND lart.id_lsartnr IN (
                             SELECT lart.id_lsartnr
                                             FROM _sys_leistungsarten AS lart
                                            WHERE lart.abk IN ('Üst', 'ÜL', 'AB', 'NF', 'Uw', 'FV', 'Pf')
                )
             AND Fzg.id_fznr IN (
                           SELECT Fzg.id_fznr
                                         FROM _ctbl_fahrzeuge AS Fzg
                                        WHERE FeK.klasse = 'B'
                AND Fzg.status = 1
             )
                                     GROUP BY FeK.klasse) 
 ELSE '-'
 END AS Verg_B,
[sql]
 

Neue Beiträge

Zurück