# Hi nette Profis, kann ich diese Abfrage Optimieren



## Technic1965 (4. August 2017)

Kann ich diese Abfrage optimieren? ein Beispiel würde mir vielleicht weiterhelfen 


```
(Sum((SELECT
IfNull(Sum(davidw2000._mtbl_leistsonstiges.lsdauer), 0)
FROM
davidw2000._mtbl_leistsonstiges
WHERE
davidw2000._mtbl_leist.id_flleist = davidw2000._mtbl_leistsonstiges.id_flleist AND
davidw2000._mtbl_leistsonstiges.id_lsart IN (38)))) AS Urlaub,
(Sum((SELECT
IfNull(Sum(davidw2000._mtbl_leistsonstiges.lsdauer), 0)
FROM
davidw2000._mtbl_leistsonstiges
WHERE
davidw2000._mtbl_leist.id_flleist = davidw2000._mtbl_leistsonstiges.id_flleist AND
davidw2000._mtbl_leistsonstiges.id_lsart IN (40)))) AS Krank,
(Sum((SELECT
IfNull(Sum(davidw2000._mtbl_leistsonstiges.lsdauer), 0)
FROM
davidw2000._mtbl_leistsonstiges
WHERE
davidw2000._mtbl_leist.id_flleist = davidw2000._mtbl_leistsonstiges.id_flleist AND
davidw2000._mtbl_leistsonstiges.id_lsart IN (42)))) AS Feiertag
```


----------



## Biber3 (6. August 2017)

Moin Technic1965,

es geht doch immer noch um diese Abfrage aus deinem letzten Beitrag, den du als gelöst markiert hast?

Sprich, der Ausschnitt, den du gepostet hast, ist Teil einer Abfrage, die wie folgt aufgebaut ist

```
SELECT 
  -- <Klartextfelder für Mitarbeiter + Tage laut Tabelle "Leistung">
    <dein Ausschnitt oben>
FROM <4 verknibbelte Tabellen>
WHERE <mitarbeiternr= x und Zeitraum between y und z>
GROUP BY <mitarbeiternr und gefundene Tage>
```

Da die Tabellen, aus denen du jetzt die Urlaub/Krank/Feiertage holst, ohnehin schon in der Zeile
FROM <4 verknibbelte Tabellen>
... vorhanden sind, brauchst du wirklich nicht diese Werte mit einem Inline.Select zu holen.

Das obige Geraffel würde im ersten Ansatz so aussehen:

```
Select
      leist.id_nrmitar
    , leist.lsdate
    , case when (Sum (case when lsonst.id_lsart = 38
                           then lsonst.lsdauer
                           else 0 end   ) > 0
           then 'U' else '-' end as Urlaub
    , case when (Sum (case when lsonst.id_lsart = 40
                           then lsonst.lsdauer
                           else 0 end ) > 0
           then 'K' else '-' end as Krank
    , case when(Sum (case when lsonst.id_lsart = 42
                          then lsonst.lsdauer
                          else 0 end ) > 0
           then 'F' else '-' end as Feiertag
FROM davidw2000._mtbl_leist as leist
   LEFT JOIN davidw2000._mtbl_leistsonstiges as lsonst on leist.id_flleist = lsonst.id_flleist
   -- weitere JOINs ...
   -- WHERE ... <mitarbeiter=x und Zeitraum between y and z>
GROUP BY
  leist.id_nrmitar,
  leist.lsdate
;
;
```

Ist auch nicht gerade wartungsfreundlich durch die notwendigen verschachtelten CASE WHENs.

Geschickter wäre es eher, die Klamotte aufzuteilen in ein inneres SELECT, in dem die Summenwerte aus allen Tabellen geholt werden, die irgendwie an der Haupttabelle "Leistungen" (=davidw2000._mtbl_leist)  hängen UND datumsabhängige Zahlenwerte enthalten.  Also alles, was tatsächlich mit GROUP BY zusammengedampf werden soll, NICHT aber diese Dimensionstabellen für Anrede und Mitarbeiterdaten im Klartext (Name, Vorname, Sternzeichen,,) .
Die brauchen nicht gruppiert werden und können später an das Summen-Resultset drangeflanscht werden.

Eine grobe Skizze für die Gesamtabfrage war demzufolge das hier:

```
SELECT anr.Text           AS Anrede
     , stamm.mavname     AS Vorname,
     , stammdaten.maname AS Name,
     -- , x.id_nrmitar /* interne ID, muss nicht angezeigt werden */
     , x.lsdate
     , case when x.sumUrlaub   > 0 then 'U' else '-' end as Urlaub
     , case when x.sumKrank    > 0 then 'K' else '-' end as Krank
     , case when x.SumFeiertag > 0 then 'F' else '-' end as Feiertag
FROM (
    /* inneres SELECT: alle Summenwerte aus einem SELECT von Tabelle "leist" mit allen ihren Childs */
     Select  leist.id_nrmitar
           , leist.lsdate
           , Sum (case when lsonst.id_lsart = 38
                       then lsonst.lsdauer
                      else 0 end   ) as sumUrlaub 
            , Sum (case when lsonst.id_lsart = 40
                        then lsonst.lsdauer
                        else 0 end ) as SumKrank
            , Sum (case when lsonst.id_lsart = 42
                       then lsonst.lsdauer
                       else 0 end ) as SumFeiertag
        FROM davidw2000._mtbl_leist as leist
          -- weitere JOINs .. (hier nicht wesentlich)
           -- LEFT JOIN davidw2000._kde_leist...
           -- LEFT JOIN davidw2000._mtbl_leistunterricht
           LEFT JOIN davidw2000._mtbl_leistsonstiges as lsonst
              on leist.id_flleist = lsonst.id_flleist
        WHERE leist.id_nrmitar = 5
          AND leist.lsdate BETWEEN '2017-06-01 00:00:00' AND '2017-06-31 23:59:59'
        GROUP BY
          leist.id_nrmitar,
          leist.lsdate
        )  as x

  INNER JOIN davidw2000._mtbl_stammdaten AS Stamm ON x.id_nrmitar = Stamm.id_mitar
  INNER JOIN davidw2000._sys_anrede      AS Anr   ON Stamm.id_anrnr = anr.id_anrnr
```

Ist natürlich von mir nur biooptisch auf Tippfehler geprüft worden, testen kann ich es nicht.
Kannst ja mal die letzte Codevariante antesten - die sollte zeigen, ob es prinzipiell _works as designed_.

Grüße
Biber


----------



## Technic1965 (8. August 2017)

Biber3 hat gesagt.:


> Moin Technic1965,
> 
> es geht doch immer noch um diese Abfrage aus deinem letzten Beitrag, den du als gelöst markiert hast?
> 
> ...



Danke Biber3,

hatte erst Zeit gehabt, verstehe gerade nicht was dieser Fehler bedeutet:
SQL Fehler (1630): FUNKTION davidw2000.SUM does not exist. Check the 'Funktion Name Parsing and Resolution' section in the Reference Manual


----------



## Biber3 (8. August 2017)

Moin Technic1965,

sorry, mein Fehler.
Es darf natürlich bei der SUM()-Function kein Leerzeichen zwischen "SUM" und der öffnenden Klammer sein.

Ersetze bitte jeweils das "SUM (CASE WHEN ..." durch "SUM(CASE WHEN..."

Andere Tippfehler habe ich auch noch in Zeile 2 und 3 des letzten Statements gesehen.
Hier statt "     , stammdaten.maname AS Name" den richtigen Alias "     , stamm.maname AS Name"
und jeweils das Komma am Ende der Zeile entfernen.


```
SELECT anr.Text           AS Anrede
     , stamm.mavname     AS Vorname
     , stamm.maname AS Name
     , <bla>....
```


Grüße
Biber


----------



## Fragenfrager (8. August 2017)

Um welches DBMS handelt es sich?
Falls es MSSQL ist, dann könntest Du mit Common Table Expressions (CTE) arbeiten (https://docs.microsoft.com/en-us/sql/t-sql/queries/with-common-table-expression-transact-sql). Das ist dann sinnvoll, wenn wie bei Dir mehrfach mit denselben Tabellen gearbeitet wird.


----------



## Technic1965 (8. August 2017)

HI Biber3

mittlerweile sieht es so aus

```
SELECT Anr.Text AS Anrede,
stamm.mavname AS Vorname,
stamm.maname AS Name,
Date_Format(x.lsdate, '%d.%m.%Y') AS Datum,
Ifnull(x.sumTheorie ,0) AS Theorie,
CASE WHEN x.sumFahrs_Mofa > 0 THEN Ifnull(x.sumFahrs_Mofa ,0) ELSE '-' END AS Fahrs_Mofa,
CASE WHEN x.sumFahrs_AM > 0 THEN Ifnull(x.sumFahrs_AM ,0) ELSE '-' END AS Fahrs_AM,
CASE WHEN x.sumFahrs_A1 > 0 THEN Ifnull(x.sumFahrs_A1 ,0) ELSE '-' END AS Fahrs_A1,
CASE WHEN x.sumFahrs_AA2 > 0 THEN Ifnull(x.sumFahrs_AA2 ,0) ELSE '-' END AS Fahrs_AA2,
CASE WHEN x.sumFahrs_B > 0 THEN Ifnull(x.sumFahrs_B ,0) ELSE '-' END AS Fahrs_B,
CASE WHEN x.sumFahrs_BE > 0 THEN Ifnull(x.sumFahrs_BE ,0) ELSE '-' END AS Fahrs_BE,

CASE WHEN x.sumUrlaub > 0 THEN 'U' ELSE '-' END AS Urlaub,
CASE WHEN x.sumKrank > 0 THEN 'K' ELSE '-' END AS Krank,
CASE WHEN x.SumFeiertag > 0 THEN 'F' ELSE '-' END AS Feiertag

FROM (

[I]/* inneres SELECT: alle Summenwerte aus einem SELECT von Tabelle "leist" mit allen ihren Childs */
[/I]
SELECT leist.id_nrmitar, leist.lsdate,
SUM(ltheo.dauer) AS sumTheorie,

SUM(CASE WHEN lfahrs.isUnterschrift = True
AND lfahrs.is_fsklnr IN ('27')

THEN lfahrs.lsdauer
ELSE 0 END ) AS sumFahrs_Mofa,

SUM(CASE WHEN lfahrs.isUnterschrift = True
AND lfahrs.is_fsklnr IN ('50')

THEN lfahrs.lsdauer
ELSE 0 END ) AS sumFahrs_AM,

SUM(CASE WHEN lfahrs.isUnterschrift = True
AND lfahrs.is_fsklnr IN ('13')

THEN lfahrs.lsdauer
ELSE 0 END ) AS sumFahrs_A1,

SUM(CASE WHEN lfahrs.isUnterschrift = True
AND lfahrs.is_fsklnr IN ('51','53')

THEN lfahrs.lsdauer
ELSE 0 END ) AS sumFahrs_AA2,

SUM(CASE WHEN lfahrs.isUnterschrift = True
AND lfahrs.is_fsklnr IN ('15')

THEN lfahrs.lsdauer
ELSE 0 END ) AS sumFahrs_B,

SUM(CASE WHEN lfahrs.isUnterschrift = True
AND lfahrs.is_fsklnr IN ('52')

THEN lfahrs.lsdauer
ELSE 0 END ) AS sumFahrs_BE,

SUM(CASE WHEN lsonst.id_lsart = 38
THEN lsonst.lsdauer
ELSE 0 END ) AS sumUrlaub,

SUM(CASE WHEN lsonst.id_lsart = 40
THEN lsonst.lsdauer
ELSE 0 END ) AS SumKrank,

SUM(CASE WHEN lsonst.id_lsart = 42
THEN lsonst.lsdauer
ELSE 0 END ) AS SumFeiertag
FROM davidw2000._mtbl_leist AS leist

LEFT JOIN davidw2000._mtbl_leistsonstiges AS lsonst ON leist.id_flleist = lsonst.id_flleist
LEFT JOIN davidw2000._mtbl_leistunterricht AS ltheo ON leist.id_flleist = ltheo.id_flleist
LEFT JOIN davidw2000._kde_leist AS lkde ON leist.id_flleist = lkde.id_flleist
LEFT JOIN davidw2000._kde_leistfahrstunden AS lfahrs ON lkde.id_kdleist = lfahrs.id_kdleist
LEFT JOIN davidw2000._kde_leistpruefungpraxis AS lprapru ON lkde.id_kdleist = lprapru.id_kdleist

WHERE leist.id_nrmitar = 3
AND leist.lsdate BETWEEN '2017-06-01 00:00:00' AND '2017-06-31 23:59:59'
GROUP BY


leist.id_nrmitar,
leist.lsdate DESC) AS x

INNER JOIN davidw2000._mtbl_stammdaten AS Stamm ON x.id_nrmitar = Stamm.id_mitar
INNER JOIN davidw2000._sys_anrede AS Anr ON Stamm.id_anrnr = Anr.id_anrnr
```

Dauer von 1 Abfrage: 0,969 sec.
ich ändere mal das ganze und melde mich nochmal in 1-2 Tagen, was mich gerade ärgert ist das wenn ich die Tabelle

```
LEFT JOIN davidw2000._kde_leist AS lkde ON leist.id_flleist = lkde.id_flleist
```
 verbinde, bekomme ich hier 
	
	
	



```
Ifnull(x.sumTheorie ,0) AS Theorie
```
 eine Menge von Unt. Minuten also holt sich noch von der Tabelle (davidw2000._kde_leist) Daten.


----------



## Biber3 (9. August 2017)

Moin Technic1965,

ein paar Rückfragen und Anmerkungen hätte ich noch, die dann in den nächsten 1, 2 Tagen mit in deinen nächsten Kommentar einarbeiten könntest.

Rückfragen:
- kommt denn inhaltlich ein plausibles Ergebnis heraus, welches sich mit den Ergebnissen der Ur-Abfrage (also dem Stand von August) deckt?
- was bedeutet "Dauer von 1 Abfrage: 0,969 sec"? Ist das akzeptabel oder sollten wir ein bisschen optimieren? Wie lange hatte den die Ur-Abfrage gebraucht?
- den Satz ganz unten "...eine Menge von Unt. Minuten also holt sich noch von der Tabelle (davidw2000._kde_leist) Daten." hab ich nicht verstanden. Kannst du den mal mit anderen Worten ausdrücken?

letzte Rückfrage: was ist denn aus dem "geteilt durch 45" geworden, welches doch bei vielen Summen verwendet wurde, um von Minuten auf Unterrichtsstunden zu kommen?

Anmerkungen:
- in diesen Konstrukten

```
CASE WHEN x.sumFahrs_A1 > 0 THEN Ifnull(x.sumFahrs_A1 ,0) ELSE '-' END AS Fahrs_A1,
```
...ist die Ifnull()-Prüfung Dönekens. WENN summebla größer 0 ist, kann sie nicht NULL sein. Streiche IsNull()

Bei den folgenden Konstrukten:

```
SUM(CASE WHEN lfahrs.isUnterschrift = TRUE
AND lfahrs.is_fsklnr IN ('52')
```
-> da IMMER nur Datensätze mit "lfahrs.isUnterschrift = TRUE" berücksichtigt werden, kann diese Bedingung einfach zusätzlich mit in den LEFT JOIN, mit dem die lfahrs-Tabelle drangeflanscht wird. Dann brauchst du es nicht in jedem CASE-Fall.
Außerdem könnte , wenn nur ein Wert geprüft muss , statt "lfahrs.is_fsklnr IN ('52')" ein "lfahrs.is_fsklnr ='52'" performanter sein.
Und sind diese fsklnr wirklich vom Typ String, also '52', '15' usw. oder doch vielleicht Zahlen 52, 15, etc?
Falls es in der Tabelle Zahlen sind, dann solltest du es auch in der Query ohne Anführungszeichen schreiben, da dein mySQL sonst immer eine (unnötige) implizite Typkonvertierung machen muss.

Ganz unten in deiner Query steht

GROUP BY
leist.id_nrmitar,
leist.lsdate DESC) AS x

WTF soll denn das Schlüsselwort "DESC"da ? Das gehört ggf. in eine zusätzliche ORDER BY-Klausel als allerletzte Zeile, wenn du den Resultset sortiert haben willst.
Kannst also als neue letzte Zeile ergänzen
" ORDER BY x.lsdate DESC" (ist ja nur ein Mitarbeiter, also brauchst du nicht mher nach Mitarbeiter sortieren)
Und das "DESC" beim GROUP BY" ersatzlos streichen, sonst bringst du deine Datenbank unnötig in Grübeleien.

Grüße
Biber


----------



## Technic1965 (9. August 2017)

Danke dir Biber3, 
Werde ich tun, auf jedenfall und mit klarem Kopf nochmal kommentieren, ich war wohl wieder zu müde, nochmals danke.

So Bieber3 mitlerweile sieht es so aus, habe aber  "x.sumTheorie As Theorie" ein problem wenn _mtbl_leist.id_flleist mit der _kde_leist.id_flleist verbinde bekommt man mehr Arbeitszeiten weil in der kde_leist Tabelle einträge der kunden sind die in einem 90 min unterricht waren, wenn im unterricht 5 kunden waren dann bekommt man 5x90 also 450 min statt 90 min, lösche ich "LEFT JOIN davidw2000._kde_leist AS lkde ON leist.id_flleist = lkde.id_flleist" dan bekomme ich 90 min also nur die in der _mtbl_leist Tabelle, wie kann ich vermeiden das durch die Verbindung auch Arbeitszeiten aus _kde_leist geholt werden





```
SELECT Anr.Text AS Anrede,
stamm.mavname AS Vorname,
stamm.maname AS Name,
Date_Format(x.lsdate, '%d.%m.%Y') AS Datum,
x.sumTheorie AS Theorie,
CASE WHEN x.sumFahrs_Mofa > 0 THEN x.sumFahrs_Mofa ELSE '-' END AS Fahrs_Mofa,
CASE WHEN x.sumFahrs_AM > 0 THEN x.sumFahrs_AM ELSE '-' END AS Fahrs_AM,
CASE WHEN x.sumFahrs_A1 > 0 THEN x.sumFahrs_A1 ELSE '-' END AS Fahrs_A1,
CASE WHEN x.sumFahrs_A > 0 THEN x.sumFahrs_A ELSE '-' END AS Fahrs_A,
CASE WHEN x.sumFahrs_A2 > 0 THEN x.sumFahrs_A2 ELSE '-' END AS Fahrs_A2,
CASE WHEN x.sumFahrs_B > 0 THEN x.sumFahrs_B ELSE '-' END AS Fahrs_B,
CASE WHEN x.sumFahrs_BE > 0 THEN x.sumFahrs_BE ELSE '-' END AS Fahrs_BE,
CASE WHEN x.sumPraPru_AM > 0 THEN x.sumPraPru_AM ELSE '-' END AS Prax_AM,
CASE WHEN x.sumPraPru_A1 > 0 THEN x.sumPraPru_A1 ELSE '-' END AS Prax_A1,
CASE WHEN x.sumPraPru_A > 0 THEN x.sumPraPru_A ELSE '-' END AS Prax_A,
CASE WHEN x.sumPraPru_A2 > 0 THEN x.sumPraPru_A2 ELSE '-' END AS Prax_A2,
CASE WHEN x.sumPraPru_B > 0 THEN x.sumPraPru_B ELSE '-' END AS Prax_B,
CASE WHEN x.sumPraPru_BE > 0 THEN x.sumPraPru_BE ELSE '-' END AS Prax_BE,
CASE WHEN x.sumUrlaub > 0 THEN 'U' ELSE '-' END AS Urlaub,
CASE WHEN x.sumKrank > 0 THEN 'K' ELSE '-' END AS Krank,
CASE WHEN x.SumFeiertag > 0 THEN 'F' ELSE '-' END AS Feiertag

FROM (

SELECT leist.id_nrmitar,
leist.lsdate,
SUM(ltheo.dauer) AS sumTheorie,

SUM(CASE WHEN lfahrs.is_fsklnr = 27
THEN lfahrs.lsdauer
ELSE 0 END ) AS sumFahrs_Mofa,

SUM(CASE WHEN lfahrs.is_fsklnr = 50
THEN lfahrs.lsdauer
ELSE 0 END ) AS sumFahrs_AM,

SUM(CASE WHEN lfahrs.is_fsklnr = 13
THEN lfahrs.lsdauer
ELSE 0 END ) AS sumFahrs_A1,

SUM(CASE WHEN lfahrs.is_fsklnr = 51
THEN lfahrs.lsdauer
ELSE 0 END ) AS sumFahrs_A,

SUM(CASE WHEN lfahrs.is_fsklnr = 53
THEN lfahrs.lsdauer
ELSE 0 END ) AS sumFahrs_A2,

SUM(CASE WHEN lfahrs.is_fsklnr = 15
THEN lfahrs.lsdauer
ELSE 0 END ) AS sumFahrs_B,

SUM(CASE WHEN lfahrs.is_fsklnr = 52
THEN lfahrs.lsdauer
ELSE 0 END ) AS sumFahrs_BE,

SUM(CASE WHEN lprapru.id_fsklnr = 50
THEN lprapru.lsdauer
ELSE 0 END ) AS sumPraPru_AM,

SUM(CASE WHEN lprapru.id_fsklnr = 13
THEN lprapru.lsdauer
ELSE 0 END ) AS sumPraPru_A1,

SUM(CASE WHEN lprapru.id_fsklnr = 51
THEN lprapru.lsdauer
ELSE 0 END ) AS sumPraPru_A,

SUM(CASE WHEN lprapru.id_fsklnr = 53
THEN lprapru.lsdauer
ELSE 0 END ) AS sumPraPru_A2,

SUM(CASE WHEN lprapru.id_fsklnr = 15
THEN lprapru.lsdauer
ELSE 0 END ) AS sumPraPru_B,

SUM(CASE WHEN lprapru.id_fsklnr = 52
THEN lprapru.lsdauer
ELSE 0 END ) AS sumPraPru_BE,

SUM(CASE WHEN lsonst.id_lsart = 38
THEN lsonst.lsdauer
ELSE 0 END ) AS sumUrlaub,
SUM(CASE WHEN lsonst.id_lsart = 40
THEN lsonst.lsdauer
ELSE 0 END ) AS SumKrank,

SUM(CASE WHEN lsonst.id_lsart = 42
THEN lsonst.lsdauer
ELSE 0 END ) AS SumFeiertag

FROM davidw2000._mtbl_leist AS leist

LEFT JOIN davidw2000._mtbl_leistsonstiges AS lsonst ON leist.id_flleist = lsonst.id_flleist
LEFT JOIN davidw2000._mtbl_leistunterricht AS ltheo ON leist.id_flleist = ltheo.id_flleist
LEFT JOIN davidw2000._kde_leist AS lkde ON leist.id_flleist = lkde.id_flleist
LEFT JOIN davidw2000._kde_leistfahrstunden AS lfahrs ON lkde.id_kdleist = lfahrs.id_kdleist AND lfahrs.isUnterschrift = True
LEFT JOIN davidw2000._kde_leistpruefungpraxis AS lprapru ON lkde.id_kdleist = lprapru.id_kdleist AND lprapru.isUnterschrift = True

WHERE leist.id_nrmitar = 1
AND leist.lsdate BETWEEN '2017-06-01 00:00:00' AND '2017-06-30 23:59:59'
GROUP BY
leist.id_nrmitar,
leist.lsdate
ORDER BY leist.lsdate DESC) AS x

INNER JOIN davidw2000._mtbl_stammdaten AS Stamm ON x.id_nrmitar = Stamm.id_mitar
INNER JOIN davidw2000._sys_anrede AS Anr ON Stamm.id_anrnr = Anr.id_anrnr[sql]

Also so hätte ich richtige Ergebnissen wenn ich aber Tabelle "_mtbl_leist" nicht mit "_kde_leist" verbinde bekomme ich die Werte aus der Tabelle "_kde_leistfahrstunden" und  "_kde_leistpruefungpraxis"  nicht, wie unten sind die Theoriezeiten richtig
[ATTACH=full]65214[/ATTACH]

[code=SQL]
SELECT Anr.Text AS Anrede,
stamm.mavname AS Vorname,
stamm.maname AS Name,
Date_Format(x.lsdate, '%d.%m.%Y') AS Datum,
x.sumTheorie AS Theorie,

CASE WHEN x.sumUrlaub > 0 THEN 'U' ELSE '-' END AS Urlaub,
CASE WHEN x.sumKrank > 0 THEN 'K' ELSE '-' END AS Krank,
CASE WHEN x.SumFeiertag > 0 THEN 'F' ELSE '-' END AS Feiertag

FROM (
SELECT leist.id_nrmitar,
leist.lsdate,

SUM(ltheo.dauer) AS sumTheorie,

SUM(CASE WHEN lsonst.id_lsart = 38
THEN lsonst.lsdauer
ELSE 0 END ) AS sumUrlaub,

SUM(CASE WHEN lsonst.id_lsart = 40
THEN lsonst.lsdauer
ELSE 0 END ) AS SumKrank,

SUM(CASE WHEN lsonst.id_lsart = 42
THEN lsonst.lsdauer
ELSE 0 END ) AS SumFeiertag
FROM davidw2000._mtbl_leist AS leist
LEFT JOIN davidw2000._mtbl_leistsonstiges AS lsonst ON leist.id_flleist = lsonst.id_flleist
LEFT JOIN davidw2000._mtbl_leistunterricht AS ltheo ON leist.id_flleist = ltheo.id_flleist

WHERE leist.id_nrmitar = 1
AND leist.lsdate BETWEEN '2017-06-01 00:00:00' AND '2017-06-30 23:59:59'
GROUP BY
leist.id_nrmitar,
leist.lsdate
ORDER BY leist.lsdate DESC) AS x

INNER JOIN davidw2000._mtbl_stammdaten AS Stamm ON x.id_nrmitar = Stamm.id_mitar
INNER JOIN davidw2000._sys_anrede AS Anr ON Stamm.id_anrnr = Anr.id_anrnr
[SQL]
```


----------



## Biber3 (10. August 2017)

Moin Technic1965,

du hast doch die Lösung eigentlich schon skizziert.

"....
 in der kde_leist Tabelle einträge der kunden sind die in einem 90 min unterricht waren,
  wenn im unterricht 5 kunden waren dann bekommt man 5x90 also 450 min statt 90 min,"

Du darfst also nicht die gesamten "konsumierten" Minuten aller Kunden heranziehen, sondern nur die erteilten Stunden des Fahrlehrers.
Kommt jetzt auf die Tabellenstruktur an.
Vermutlich steht doch in der Tabelle, in der die Unterrichtsteilnehmer stehen, doch auch entweder eine ID für die konkrete Unterrichtsstunde/Unterrichtseinheit und/oder die von/bis-Zeit.

Also schematisch vermutlich die Informationen für die Fahrschüler Hinz, Kunz und Karl

01.06.2017 UnterrichtsID=33 Teilnehmer=Hinz Von 17:30 bis 19:00 (-- und in der Childtabelle stehen deshalb 90min)
01.06.2017 UnterrichtsID=33 Teilnehmer=Kunz Von 17:30 bis 19:00 (-- und in der Childtabelle stehen deshalb 90min)
01.06.2017 UnterrichtsID=33 Teilnehmer=Karl Von 17:30 bis 19:00 (-- und in der Childtabelle stehen deshalb 90min)
01.06.2017 UnterrichtsID=34 Teilnehmer=Kunz Von 19:30 bis 21:00 (-- und in der Childtabelle stehen deshalb 90min)
01.06.2017 UnterrichtsID=34 Teilnehmer=Karl Von 19:30 bis 21:00 (-- und in der Childtabelle stehen deshalb 90min)

Richtig wäre hier also nicht die 5x90 Minuten aus der Childtabelle, sondern insgesamt 2x90 erteilte Minuten bzw. zwei erteilte Theoriestunden

Also wäre der Weg z.B. die Summe aller distincten von/bis-Zeiten oder Anzahl distincter UnterrichtsIds (falls alle Unterrichtsblöcke immer gleich lang dauern)
Ist also lösbar, aber dazu müsste man den Tabellenaufbau kennen.
Kann ja etwas anders aussehen, als ich mir den zusammenphantasiert habe.

Grüße
Biber


----------



## Technic1965 (11. August 2017)

Hi Biber,
klappt bei mir nicht  so sollte es aussehen



Aber Blödsinn kommt



Mache ich das, dann ist es richtig, dann bekomme ich aber keine Ergebnisse für die weiteren abfragen



Die Tabellen sehen so aus


----------



## Biber3 (11. August 2017)

Moin Technic1965,

wenn ich es richtig verstehe und "nur" die Spalte "Theorie" falsche Werte anzeigt, dann ändere mal den Anfang des Selects so:


```
SELECT Anr.Text AS Anrede,
stamm.mavname AS Vorname,
stamm.maname AS Name,
Date_Format(x.lsdate, '%d.%m.%Y') AS Datum,
-- x.sumTheorie AS Theorie,
( SELECT Sum(ltheo.dauer)
   FROM davidw2000._mtbl_leist as l
   INNER JOIN davidw2000._mtbl_leistunterricht as ltheo on l.id_flleist = ltheo.id_flleist
   WHERE l.lsdate = x.lsdate
   AND l.id_nrmitar .x.id_nrmitar
) as Theorie
, ...
..
FROM ( 
   <inneres Select> ) 
as x
...
```

Den Rest erstmal so lassen.
So sollten alle Theoriestunden für den Tag und den Mitarbeiter gefunden werden.

Grüße
Biber


----------



## Technic1965 (11. August 2017)

Mittlerweile sieht es so aus auch mit der Theorie klappt es jetzt

```
SELECT Date_Format(x.lsdate, '%d.%m.%Y') AS Datum,
Anr.Text AS Anrede,
stamm.mavname AS Vorname,
stamm.maname AS Name,
(SELECT Ifnull(SUM(ltheo.dauer),0)
FROM davidw2000._mtbl_leist AS l
INNER JOIN davidw2000._mtbl_leistunterricht AS ltheo ON l.id_flleist = ltheo.id_flleist
WHERE l.lsdate = x.lsdate
AND l.id_nrmitar = x.id_nrmitar)AS Theorie,
CASE WHEN x.sumFahrs_Mofa > 0 THEN x.sumFahrs_Mofa ELSE '-' END AS Fahrs_Mofa,
CASE WHEN x.sumFahrs_AM > 0 THEN x.sumFahrs_AM ELSE '-' END AS Fahrs_AM,
CASE WHEN x.sumFahrs_A1 > 0 THEN x.sumFahrs_A1 ELSE '-' END AS Fahrs_A1,
CASE WHEN x.sumFahrs_A > 0 THEN x.sumFahrs_A ELSE '-' END AS Fahrs_A,
CASE WHEN x.sumFahrs_A2 > 0 THEN x.sumFahrs_A2 ELSE '-' END AS Fahrs_A2,
CASE WHEN x.sumFahrs_B > 0 THEN x.sumFahrs_B ELSE '-' END AS Fahrs_B,
CASE WHEN x.sumFahrs_BE > 0 THEN x.sumFahrs_BE ELSE '-' END AS Fahrs_BE,
CASE WHEN x.sumPraPru_AM > 0 THEN x.sumPraPru_AM ELSE '-' END AS Prax_AM,
CASE WHEN x.sumPraPru_A1 > 0 THEN x.sumPraPru_A1 ELSE '-' END AS Prax_A1,
CASE WHEN x.sumPraPru_A > 0 THEN x.sumPraPru_A ELSE '-' END AS Prax_A,
CASE WHEN x.sumPraPru_A2 > 0 THEN x.sumPraPru_A2 ELSE '-' END AS Prax_A2,
CASE WHEN x.sumPraPru_B > 0 THEN x.sumPraPru_B ELSE '-' END AS Prax_B,
CASE WHEN x.sumPraPru_BE > 0 THEN x.sumPraPru_BE ELSE '-' END AS Prax_BE,
CASE WHEN x.sumFahrs_Versaeumt > 0 THEN x.sumFahrs_Versaeumt ELSE '-' END AS Fahrs_Versaeumt,
CASE WHEN x.sumPraPruU_fehlt OR x.sumFahrsU_fehlt > 0 THEN ((x.sumPraPruU_fehlt)+(x.sumFahrsU_fehlt)) ELSE '-' END AS Uschrift_fehlt,
CASE WHEN x.sumFahrs_TagG OR x.sumPraPru_TagG > 0 THEN ((x.sumFahrs_TagG)+(x.sumPraPru_TagG)) ELSE '-' END AS Tag_Gesammt,
CASE WHEN x.sumUrlaub > 0 THEN 'U' ELSE '-' END AS Urlaub,
CASE WHEN x.sumKrank > 0 THEN 'K' ELSE '-' END AS Krank,
CASE WHEN x.SumFeiertag > 0 THEN 'F' ELSE '-' END AS Feiertag

FROM (

SELECT leist.id_nrmitar,
leist.lsdate,

SUM(CASE WHEN lfahrs.is_fsklnr = 27
THEN lfahrs.lsdauer
ELSE 0 END ) AS sumFahrs_Mofa,

SUM(CASE WHEN lfahrs.is_fsklnr = 50
THEN lfahrs.lsdauer
ELSE 0 END ) AS sumFahrs_AM,

SUM(CASE WHEN lfahrs.is_fsklnr = 13
THEN lfahrs.lsdauer
ELSE 0 END ) AS sumFahrs_A1,

SUM(CASE WHEN lfahrs.is_fsklnr = 51
THEN lfahrs.lsdauer
ELSE 0 END ) AS sumFahrs_A,

SUM(CASE WHEN lfahrs.is_fsklnr = 53
THEN lfahrs.lsdauer
ELSE 0 END ) AS sumFahrs_A2,

SUM(CASE WHEN lfahrs.is_fsklnr = 15
THEN lfahrs.lsdauer
ELSE 0 END ) AS sumFahrs_B,

SUM(CASE WHEN lfahrs.is_fsklnr = 52
THEN lfahrs.lsdauer
ELSE 0 END ) AS sumFahrs_BE,

SUM(CASE WHEN lfahrs.is_fsklnr IN ('13','27','50','51','53','15','52')
THEN lfahrs.lsdauer
ELSE 0 END ) AS sumFahrs_TagG,

SUM(CASE WHEN lprapru.id_fsklnr = 50
THEN lprapru.lsdauer
ELSE 0 END ) AS sumPraPru_AM,

SUM(CASE WHEN lprapru.id_fsklnr = 13
THEN lprapru.lsdauer
ELSE 0 END ) AS sumPraPru_A1,

SUM(CASE WHEN lprapru.id_fsklnr = 51
THEN lprapru.lsdauer
ELSE 0 END ) AS sumPraPru_A,

SUM(CASE WHEN lprapru.id_fsklnr = 53
THEN lprapru.lsdauer
ELSE 0 END ) AS sumPraPru_A2,

SUM(CASE WHEN lprapru.id_fsklnr = 15
THEN lprapru.lsdauer
ELSE 0 END ) AS sumPraPru_B,

SUM(CASE WHEN lprapru.id_fsklnr = 52
THEN lprapru.lsdauer
ELSE 0 END ) AS sumPraPru_BE,

SUM(CASE WHEN lprapru.id_fsklnr IN ('13','27','50','51','53','15','52')
THEN lprapru.lsdauer
ELSE 0 END ) AS sumPraPru_TagG,

SUM(CASE WHEN lkde.id_lsart = 18 AND
lfahrs.is_fsklnr IN ('13','27','50','51','53','15','52')
THEN lfahrs.lsdauer
ELSE 0 END ) AS sumFahrs_Versaeumt,

SUM(CASE WHEN lprapruUsF.id_fsklnr IN ('13','27','50','51','53','15','52')
THEN lprapruUsF.lsdauer
ELSE 0 END ) AS sumPraPruU_fehlt,

SUM(CASE WHEN lfahrsUsF.is_fsklnr IN ('13','27','50','51','53','15','52')
THEN lfahrsUsF.lsdauer
ELSE 0 END ) AS sumFahrsU_fehlt,

SUM(CASE WHEN lsonst.id_lsart = 38
THEN lsonst.lsdauer
ELSE 0 END ) AS sumUrlaub,

SUM(CASE WHEN lsonst.id_lsart = 40
THEN lsonst.lsdauer
ELSE 0 END ) AS SumKrank,

SUM(CASE WHEN lsonst.id_lsart = 42
THEN lsonst.lsdauer
ELSE 0 END ) AS SumFeiertag

FROM davidw2000._mtbl_leist AS leist



LEFT JOIN davidw2000._kde_leist AS lkde ON lkde.id_flleist = leist.id_flleist
LEFT JOIN davidw2000._mtbl_leistsonstiges AS lsonst ON lsonst.id_flleist = leist.id_flleist
LEFT JOIN davidw2000._kde_leistfahrstunden AS lfahrs ON lkde.id_kdleist = lfahrs.id_kdleist AND lfahrs.isUnterschrift = True
LEFT JOIN davidw2000._kde_leistpruefungpraxis AS lprapru ON lkde.id_kdleist = lprapru.id_kdleist AND lprapru.isUnterschrift = True
LEFT JOIN davidw2000._kde_leistfahrstunden AS lfahrsUsF ON lkde.id_kdleist = lfahrsUsF.id_kdleist AND lfahrsUsF.isUnterschrift = False
LEFT JOIN davidw2000._kde_leistpruefungpraxis AS lprapruUsF ON lkde.id_kdleist = lprapruUsF.id_kdleist AND lprapruUsF.isUnterschrift = False

WHERE leist.id_nrmitar = 1
AND leist.lsdate BETWEEN '2017-06-01 00:00:00' AND '2017-06-30 23:59:59'
GROUP BY
leist.lsdate
ORDER BY
leist.lsdate DESC) AS x

INNER JOIN davidw2000._mtbl_stammdaten AS Stamm ON x.id_nrmitar = Stamm.id_mitar
INNER JOIN davidw2000._sys_anrede AS Anr ON Stamm.id_anrnr = Anr.id_anrnr
```

Hi Biber3,
Muss ich hier was ändern oder korrigieren, Lesbarkeit Optik 
Ich müsste jetzt die "Theorie" mit "Tag_Gesammt" addieren
 und alles was ich in Tage Gruppiert habe benötige ich also auch addiert für den angegebenen Zeitraum (01.06.2017 bis 30.06.2017) Theorie Monatssumme und auch für alle anderen Leistungen.

Nette Grüsse TECHNIC


----------



## Biber3 (11. August 2017)

Moin Technic1965,

Du hast noch einen Left Join doppelt drin, da würde einer reichen. Und den left join auf die leistaonstiges brauchst du im inneren select  gar nicht mehr.

Eine Summenzeile bekommen wir auch noch hin, ich bin aber erstmal ein paar Tage weg

Bis dahin
Biber


----------



## Technic1965 (13. August 2017)

Ok, danke dir, schönen Urlaub 

Technic

In dieser Abfrage sehe ich aber den Fehler nicht und bekomme diese Fehlermeldung
MYSQL ERROR 1248 (42000): Every derived table must have its own alias

```
CASE WHEN X.PpAz_1_AM = 0 THEN '-' ELSE x.PpAz_1_AM END AS Pa_1_AM,
CASE WHEN x.PpAz_1_A1 = 0 THEN '-' ELSE x.PpAz_1_A1 END AS Pa_1_A1,
CASE WHEN x.PpAz_1_A = 0 THEN '-' ELSE x.PpAz_1_A END AS Pa_1_A,
CASE WHEN x.PpAz_1_A2 = 0 THEN '-' ELSE x.PpAz_1_A2 END AS Pa_1_A2,
CASE WHEN x.PpAz_1_B = 0 THEN '-' ELSE x.PpAz_1_B END AS Pa_1_B,
CASE WHEN x.PpAz_1_BE = 0 THEN '-' ELSE x.PpAz_1_BE END AS Pa_1_BE,
CASE WHEN x.PpAz_2_AM = 0 THEN '-' ELSE x.PpAz_2_AM END AS Pa_2_AM,
CASE WHEN x.PpAz_2_A1 = 0 THEN '-' ELSE x.PpAz_2_A1 END AS Pa_2_A1,
CASE WHEN x.PpAz_2_A = 0 THEN '-' ELSE x.PpAz_2_A END AS Pa_2_A,
CASE WHEN x.PpAz_2_A2 = 0 THEN '-' ELSE x.PpAz_2_A2 END AS Pa_2_A2,
CASE WHEN x.PpAz_2_B = 0 THEN '-' ELSE x.PpAz_2_B END AS Pa_2_B,
CASE WHEN x.PpAz_2_BE = 0 THEN '-' ELSE x.PpAz_2_BE END AS Pa_2_BE,
CASE WHEN x.PpAz_0 = 0 THEN '-' ELSE y.PpAz_0 END AS Pp_ohne_erfolg
FROM(
/* Anfang Erste Bestandene Prüfung*/

SELECT
(CASE WHEN klpp.id_fsklnr = 50 AND
klp.bezeichnung IN ('Praxis','Prüfung') AND
klp.id_prstatus = 1 AND
klp.isUnterschrift = TRUE AND
ml.lsdate = x.lsdate AND
ml.id_nrmitar = x.id_nrmitar
THEN COUNT(klpp.bezeichnung)
ELSE 0 END)AS PpAz_1_AM,
(CASE WHEN klpp.id_fsklnr = 13 AND
klp.bezeichnung IN ('Praxis','Prüfung') AND
klp.id_prstatus = 1 AND
klp.isUnterschrift = TRUE AND
ml.lsdate = x.lsdate AND
ml.id_nrmitar = x.id_nrmitar
THEN COUNT(klpp.bezeichnung)
ELSE 0 END)AS PpAz_1_A1,
(CASE WHEN klpp.id_fsklnr = 51 AND
klp.bezeichnung IN ('Praxis','Prüfung') AND
klp.id_prstatus = 1 AND
klp.isUnterschrift = TRUE AND
ml.lsdate = x.lsdate AND
ml.id_nrmitar = x.id_nrmitar
THEN COUNT(klpp.bezeichnung)
ELSE 0 END) AS PpAz_1_A,
(CASE WHEN klpp.id_fsklnr = 53 AND
klp.bezeichnung IN ('Praxis','Prüfung') AND
klp.id_prstatus = 1 AND
klp.isUnterschrift = TRUE AND
ml.lsdate = x.lsdate AND
ml.id_nrmitar = x.id_nrmitar
THEN COUNT(klpp.bezeichnung)
ELSE 0 END) AS PpAz_1_A2,
(CASE WHEN klpp.id_fsklnr = 15 AND
klp.bezeichnung IN ('Praxis','Prüfung') AND
klp.id_prstatus = 1 AND
klp.isUnterschrift = TRUE AND
ml.lsdate = x.lsdate AND
ml.id_nrmitar = x.id_nrmitar
THEN COUNT(klpp.bezeichnung)
ELSE 0 END) AS PpAz_1_B,
(CASE WHEN klpp.id_fsklnr = 16 AND
klp.bezeichnung IN ('Praxis','Prüfung') AND
klp.id_prstatus = 1 AND
klp.isUnterschrift = TRUE AND
ml.lsdate = x.lsdate AND
ml.id_nrmitar = x.id_nrmitar
THEN COUNT(klpp.bezeichnung)
ELSE 0 END) AS PpAz_1_BE,
/* Anfang Zweite Bestandene Prüfung*/
 
(CASE WHEN klpp.id_fsklnr = 50 AND
klp.bezeichnung IN ('WH Praxis','WH Prüfung') AND
klp.id_prstatus = 2 AND
klp.isUnterschrift = TRUE AND
ml.lsdate = x.lsdate AND
ml.id_nrmitar = x.id_nrmitar
THEN COUNT(klpp.bezeichnung)
ELSE 0 END)AS PpAz_2_AM,
(CASE WHEN klpp.id_fsklnr = 13 AND
klp.bezeichnung IN ('WH Praxis','WH Prüfung') AND
klp.id_prstatus = 2 AND
klp.isUnterschrift = TRUE AND
ml.lsdate = x.lsdate AND
ml.id_nrmitar = x.id_nrmitar
THEN COUNT(klpp.bezeichnung)
ELSE 0 END)AS PpAz_2_A1,
(CASE WHEN klpp.id_fsklnr = 51 AND
klp.bezeichnung IN ('WH Praxis','WH Prüfung') AND
klp.id_prstatus = 2 AND
klp.isUnterschrift = TRUE AND
ml.lsdate = x.lsdate AND
ml.id_nrmitar = x.id_nrmitar
THEN COUNT(klpp.bezeichnung)
ELSE 0 END) AS PpAz_2_A,
(CASE WHEN klpp.id_fsklnr = 53 AND
klp.bezeichnung IN ('WH Praxis','WH Prüfung') AND
klp.id_prstatus = 2 AND
klp.isUnterschrift = TRUE AND
ml.lsdate = x.lsdate AND
ml.id_nrmitar = x.id_nrmitar
THEN COUNT(klpp.bezeichnung)
ELSE 0 END) AS PpAz_2_A2,
(CASE WHEN klpp.id_fsklnr = 15 AND
klp.bezeichnung IN ('WH Praxis','WH Prüfung') AND
klp.id_prstatus = 2 AND
klp.isUnterschrift = TRUE AND
ml.lsdate = x.lsdate AND
ml.id_nrmitar = x.id_nrmitar
THEN COUNT(klpp.bezeichnung)
ELSE 0 END) AS PpAz_2_B,
(CASE WHEN klpp.id_fsklnr = 16 AND
klp.bezeichnung IN ('WH Praxis','WH Prüfung') AND
klp.id_prstatus = 2 AND
klp.isUnterschrift = TRUE AND
ml.lsdate = x.lsdate AND
ml.id_nrmitar = x.id_nrmitar
THEN COUNT(klpp.bezeichnung)
ELSE 0 END) AS PpAz_2_BE,
/* Anfang Erste und Zweite Nicht Bestandene Prüfung*/
 
(CASE WHEN klpp.id_fsklnr IN (50,13,51,53,15,16) AND
klp.bezeichnung IN ('Praxis','Prüfung','WH Praxis','WH Prüfung') AND
klp.id_prstatus = 2 AND
klp.isUnterschrift = TRUE AND
ml.lsdate = x.lsdate AND
ml.id_nrmitar = x.id_nrmitar
THEN COUNT(klpp.bezeichnung)
ELSE 0 END) AS PpAz_0
FROM davidw2000._mtbl_leist AS ml
LEFT JOIN davidw2000._kde_leist AS kl ON ml.id_flleist = kl.id_flleist
LEFT JOIN davidw2000._kde_leistpruefungpraxis AS klpp ON kl.id_kdleist = klpp.id_kdleist
[sql]
```


----------



## Biber3 (14. August 2017)

Moin Technic1965,

ist ein bisschen schwierig zu erkennen, wo jetzt dieser Ausschnitt hingehört... Es ist für mich nicht erkennbar, wo das enthaltene 'select from ( ' seine schließende Klammer hat.. Jedenfalls hast du in einem Left Join einen Tabellenalias Kl vergeben, sprichst ihn aber als Alias Klp an.
Das dürfte die Fehlermeldung auslösen.

Gibt es denn jetzt ein Summen-Select mit dem Alias x und ein weiteres neues wie von dir gepostet mit dem Alias y oder wie ist der Plan?

Grüße 
Biber


----------



## Technic1965 (16. August 2017)

Hi Biber, ich glaube das war Unsinn was ich zusammen gereimt habe, also das ist aktuell der funktionierende teil

```
SELECT Date_Format(x.lsdate, '%d.%m.%Y') AS Ldatum,
       Anr.Text AS Anrede,
       stamm.mavname AS Vorname,
       stamm.maname AS Name,
       
               
  CASE WHEN 
       (SELECT SUM(ltheo.dauer)
        FROM davidw2000._mtbl_leist AS l
        INNER JOIN davidw2000._mtbl_leistunterricht AS ltheo ON l.id_flleist = ltheo.id_flleist    
        Where l.lsdate = x.lsdate
        AND l.id_nrmitar = x.id_nrmitar) > 0 
  Then
     (SELECT Ifnull(SUM(ltheo.dauer),0)
        FROM davidw2000._mtbl_leist AS l
        INNER JOIN davidw2000._mtbl_leistunterricht AS ltheo ON l.id_flleist = ltheo.id_flleist
        WHERE l.lsdate = x.lsdate
        AND l.id_nrmitar = x.id_nrmitar)
  ELSE '-' 
  END AS Theorie,
  
  CASE WHEN x.sumFahrs_Mofa = 0 THEN '-' ELSE x.sumFahrs_Mofa END AS Fahrs_Mofa,
  CASE WHEN x.sumFahrs_AM = 0 THEN '-' ELSE x.sumFahrs_AM END AS Fahrs_AM,
  CASE WHEN x.sumFahrs_A1 = 0 THEN '-' ELSE x.sumFahrs_A1 END AS Fahrs_A1,
  CASE WHEN x.sumFahrs_A = 0 THEN '-' ELSE x.sumFahrs_A END AS Fahrs_A,
  CASE WHEN x.sumFahrs_A2 = 0 THEN '-' ELSE x.sumFahrs_A2 END AS Fahrs_A2,  
  CASE WHEN x.sumFahrs_B = 0 THEN '-' ELSE x.sumFahrs_B END AS Fahrs_B,
  CASE WHEN x.sumFahrs_BE = 0 THEN '-' ELSE x.sumFahrs_BE END AS Fahrs_BE,
  CASE WHEN x.sumFahrs_B96 = 0 THEN '-' ELSE x.sumFahrs_B96 END AS Fahrs_B96,
  
  CASE WHEN x.sumPPru_AM = 0 THEN '-' ELSE x.sumPPru_AM END AS Prax_AM,
  CASE WHEN x.sumPPru_A1 = 0 THEN '-' ELSE x.sumPPru_A1 END AS Prax_A1,
  CASE WHEN x.sumPPru_A = 0 THEN '-' ELSE x.sumPPru_A END AS Prax_A,
  CASE WHEN x.sumPPru_A2 = 0 THEN '-' ELSE x.sumPPru_A2 END AS Prax_A2,  
  CASE WHEN x.sumPPru_B = 0 THEN '-' ELSE x.sumPPru_B END AS Prax_B,
  CASE WHEN x.sumPPru_BE = 0 THEN '-' ELSE x.sumPPru_BE END AS Prax_BE,
  CASE WHEN x.sumFahrs_Versaeumt > 0 THEN x.sumFahrs_Versaeumt ELSE '-' END AS Fahrs_Versaeumt,
  CASE WHEN x.sumPPruU_fehlt + x.sumFahrsU_fehlt > 0 THEN (x.sumPPruU_fehlt + x.sumFahrsU_fehlt) ELSE '-' END AS Uschrift_fehlt,  
  
  CASE WHEN
     (SELECT Ifnull(SUM(ltheo.dauer),0)
        FROM davidw2000._mtbl_leist AS l
        INNER JOIN davidw2000._mtbl_leistunterricht AS ltheo ON l.id_flleist = ltheo.id_flleist
        WHERE l.lsdate = x.lsdate
        AND l.id_nrmitar = x.id_nrmitar)+(x.sumFahrs_TagG)+(x.sumPPru_TagG) = 0
  THEN '-'
  ELSE 
        (SELECT Ifnull(SUM(ltheo.dauer),0)
        FROM davidw2000._mtbl_leist AS l
        INNER JOIN davidw2000._mtbl_leistunterricht AS ltheo ON l.id_flleist = ltheo.id_flleist
        WHERE l.lsdate = x.lsdate
        AND l.id_nrmitar = x.id_nrmitar)+(x.sumFahrs_TagG)+(x.sumPPru_TagG)
  END AS LTagG,
  
         
  CASE WHEN x.sumBu > 0 THEN x.sumBu ELSE '-' END AS Buro, 
  CASE WHEN x.sumPa > 0 THEN x.sumPa ELSE '-' END AS Pause,
  CASE WHEN x.sumSo > 0 THEN x.sumSo ELSE '-' END AS Sonstiges,      
  CASE WHEN x.sumUr > 0 THEN 'U' ELSE '-' END AS Urlaub,
  CASE WHEN x.sumKr > 0 THEN 'K' ELSE '-' END AS Krank,
  CASE WHEN x.SumFe > 0 THEN 'F' ELSE '-' END AS Feiertag

FROM (

/* inneres SELECT: alle Summenwerte aus einem SELECT von Tabelle "leist" mit allen ihren Childs */

SELECT  leist.id_nrmitar,
        leist.lsdate,
         
/*Fahrstundenleistungen*/ 

  SUM(CASE WHEN lfahrs.is_fsklnr = 27
    THEN lfahrs.lsdauer
  ELSE 0 END ) AS sumFahrs_Mofa,
    
  SUM(CASE WHEN lfahrs.is_fsklnr = 50
    THEN lfahrs.lsdauer
  ELSE 0 END ) AS sumFahrs_AM,
    
  SUM(CASE WHEN lfahrs.is_fsklnr = 13
    THEN lfahrs.lsdauer
  ELSE 0 END ) AS sumFahrs_A1,
    
  SUM(CASE WHEN lfahrs.is_fsklnr = 51
    THEN lfahrs.lsdauer
  ELSE 0 END ) AS sumFahrs_A,
  
  SUM(CASE WHEN lfahrs.is_fsklnr = 53
    THEN lfahrs.lsdauer
  ELSE 0 END ) AS sumFahrs_A2,
    
  SUM(CASE WHEN lfahrs.is_fsklnr = 15
    THEN lfahrs.lsdauer
  ELSE 0 END ) AS sumFahrs_B,
  
  SUM(CASE WHEN lfahrs.is_fsklnr = 16
     THEN lfahrs.lsdauer
   ELSE 0 END ) AS sumFahrs_BE,
    
  SUM(CASE WHEN lfahrs.is_fsklnr = 52
     THEN lfahrs.lsdauer
   ELSE 0 END ) AS sumFahrs_B96,
   
  SUM(CASE WHEN lfahrs.lsdauer > 0
     THEN lfahrs.lsdauer
   ELSE 0 END ) AS sumFahrs_TagG,   
 

/*PraxisPrüfungsleistungen*/   
  SUM(CASE WHEN lppru.id_fsklnr = 50
    THEN lppru.lsdauer
  ELSE 0 END ) AS sumPPru_AM,
    
  SUM(CASE WHEN lppru.id_fsklnr = 13
    THEN lppru.lsdauer
  ELSE 0 END ) AS sumPPru_A1,
    
  SUM(CASE WHEN lppru.id_fsklnr = 51
    THEN lppru.lsdauer
  ELSE 0 END ) AS sumPPru_A,
  
  SUM(CASE WHEN lppru.id_fsklnr = 53
    THEN lppru.lsdauer
  ELSE 0 END ) AS sumPPru_A2,
    
  SUM(CASE WHEN lppru.id_fsklnr = 15
       THEN lppru.lsdauer
  ELSE 0 END) AS sumPPru_B,
    
  SUM(CASE WHEN lppru.id_fsklnr = 16
     THEN lppru.lsdauer
   ELSE 0 END ) AS sumPPru_BE,
   
  SUM(CASE WHEN lppru.lsdauer > 0
     THEN lppru.lsdauer
   ELSE 0 END ) AS sumPPru_TagG,   
   
   
  SUM(CASE WHEN lkde.id_lsart = 18
       AND lfahrs.isUnterschrift = False 
     THEN lfahrs.lsdauer
   ELSE 0 END ) AS sumFahrs_Versaeumt, 
   
  SUM(CASE WHEN lppru.isUnterschrift = False
   THEN lppru.lsdauer
   ELSE 0 END ) AS sumPPruU_fehlt, 
   
  SUM(CASE WHEN lfahrs.isUnterschrift = False
   THEN lfahrs.lsdauer
   ELSE 0 END ) AS sumFahrsU_fehlt,
       
   
/*Sonstigeleistungen*/      
  SUM(CASE WHEN lsonst.id_lsart = 30
       THEN lsonst.lsdauer
       ELSE 0 END ) AS sumBu,
       
  SUM(CASE WHEN lsonst.id_lsart = 36
       THEN lsonst.lsdauer
       ELSE 0 END ) AS sumPa,
       
  SUM(CASE WHEN lsonst.id_lsart = 34
       THEN lsonst.lsdauer
       ELSE 0 END ) AS sumSo,
    
  SUM(CASE WHEN lsonst.id_lsart = 38
       THEN lsonst.lsdauer
       ELSE 0 END ) AS sumUr,
  
  SUM(CASE WHEN lsonst.id_lsart = 40
       THEN lsonst.lsdauer
       ELSE 0 END ) AS SumKr,
    
  SUM(CASE WHEN lsonst.id_lsart = 42
       THEN lsonst.lsdauer
       ELSE 0 END ) AS SumFe

FROM davidw2000._mtbl_leist AS leist

/*
-- weitere JOINs .. (hier nicht wesentlich)
-- LEFT JOIN davidw2000._kde_leist...
-- LEFT JOIN davidw2000._mtbl_leistunterricht
*/
 

LEFT JOIN davidw2000._kde_leist AS lkde ON lkde.id_flleist = leist.id_flleist
LEFT JOIN davidw2000._mtbl_leistsonstiges AS lsonst ON lsonst.id_flleist = leist.id_flleist
LEFT JOIN davidw2000._kde_leistfahrstunden AS lfahrs  ON lkde.id_kdleist = lfahrs.id_kdleist AND lfahrs.isUnterschrift = True
LEFT JOIN davidw2000._kde_leistpruefungpraxis AS lppru ON lkde.id_kdleist = lppru.id_kdleist AND lppru.isUnterschrift = True


WHERE leist.id_nrmitar = 3
AND  leist.lsdate BETWEEN '2017-06-01 00:00:00' AND '2017-06-31 23:59:59'
GROUP BY
leist.lsdate
ORDER BY
leist.lsdate DESC) AS x


INNER JOIN davidw2000._mtbl_stammdaten AS Stamm ON x.id_nrmitar = Stamm.id_mitar
INNER JOIN davidw2000._sys_anrede      AS Anr   ON Stamm.id_anrnr = Anr.id_anrnr
```

ich benötige die Anzahl der bestandenen ersten Prüfungen ("Praxis","Prüfungen") und die anzahl der WH Prüfungen ("WH Praxis","WH Prüfung")
diese als Beispiel bringen mir diese, aber wenn ich für jede klasse abfrage dauert die mir zu lange, müsste jetzt mit einem inneren SELECT alle COUNTwerte also alle Abfragen für die jeweilige klasse die anzahl der Prüfungen zählen. 


```
/*-------------------------------------Beginn Erste Bestandene Praxis Prüfung Anzahl B-BE--------------------------------------------*/

  Count(DISTINCT (SELECT
        davidw2000._kde_leistpruefungpraxis.bezeichnung
  FROM
    davidw2000._kde_leistpruefungpraxis
  WHERE
    davidw2000._kde_leistpruefungpraxis.bezeichnung IN ('Prüfung') AND
    davidw2000._kde_leistpruefungpraxis.id_prstatus IN ('1') AND
    davidw2000._kde_leistpruefungpraxis.isUnterschrift = TRUE AND
    davidw2000._kde_leist.id_kdleist = davidw2000._kde_leistpruefungpraxis.id_kdleist AND
    davidw2000._kde_leistpruefungpraxis.id_fsklnr IN ('15','52'))) AS Erste_PraxPruefung_BBE,

  /*------------------------------------------Beginn Zweite Bestandene Praxis Prüfung B-BE--------------------------------------------*/

  COUNT((SELECT
        davidw2000._kde_leistpruefungpraxis.bezeichnung
  FROM
    davidw2000._kde_leistpruefungpraxis
  WHERE
    davidw2000._kde_leistpruefungpraxis.bezeichnung IN ('WH Prüfung') AND
    davidw2000._kde_leistpruefungpraxis.id_prstatus IN ('1') AND
    davidw2000._kde_leistpruefungpraxis.isUnterschrift = TRUE AND
    davidw2000._kde_leist.id_kdleist = davidw2000._kde_leistpruefungpraxis.id_kdleist AND
    davidw2000._kde_leistpruefungpraxis.id_fsklnr IN ('15','52'))) AS Zweite_PraxPruefung_BBE,

      /*----------------------Beginn Nichtbestandene Praxis Prüfung Anzahl BBE-----------------------------------------------*/

  Count((SELECT
        davidw2000._kde_leistpruefungpraxis.bezeichnung
  FROM
    davidw2000._kde_leistpruefungpraxis
  WHERE
    davidw2000._kde_leistpruefungpraxis.bezeichnung IN ('Praxis','Prüfung','WH Prüfung','WH Praxis') AND
    davidw2000._kde_leistpruefungpraxis.id_prstatus IN ('2','3','4','5') AND
    davidw2000._kde_leistpruefungpraxis.isUnterschrift = TRUE AND
    davidw2000._kde_leist.id_kdleist = davidw2000._kde_leistpruefungpraxis.id_kdleist AND
    davidw2000._kde_leistpruefungpraxis.id_fsklnr IN ('15','52'))) AS PraxPruefung_Ohne_Erfolg_BBE,
[sql]
```

Hi Biber, das hier geht, im SQL Editor, aber nicht mit der was du unterstützt hast, wüsste nicht wo ich diesen abschnitt einfügen soll 

```
SELECT 
   CASE WHEN X.PpAz_1_AM > 0 THEN x.PpAz_1_AM ELSE '-' END AS Pa_1_AM,
     CASE WHEN x.PpAz_1_A1 > 0 THEN x.PpAz_1_A1 ELSE '-' END AS Pa_1_A1,
     CASE WHEN x.PpAz_1_A > 0 THEN x.PpAz_1_A ELSE '-' END AS Pa_1_A,
     CASE WHEN x.PpAz_1_A2 > 0 THEN x.PpAz_1_A2 ELSE '-' END AS Pa_1_A2,  
     CASE WHEN x.PpAz_1_B > 0 THEN x.PpAz_1_B ELSE '-' END AS Pa_1_B,
     CASE WHEN x.PpAz_1_BE > 0 THEN x.PpAz_1_BE ELSE '-' END AS Pa_1_BE,
     
   CASE WHEN x.PpAz_2_AM > 0 THEN x.PpAz_2_AM ELSE '-' END AS Pa_2_AM,
     CASE WHEN x.PpAz_2_A1 > 0 THEN x.PpAz_2_A1 ELSE '-' END AS Pa_2_A1,
     CASE WHEN x.PpAz_2_A > 0 THEN x.PpAz_2_A ELSE '-' END AS Pa_2_A,
     CASE WHEN x.PpAz_2_A2 > 0 THEN x.PpAz_2_A2 ELSE '-' END AS Pa_2_A2,  
     CASE WHEN x.PpAz_2_B > 0 THEN x.PpAz_2_B ELSE '-' END AS Pa_2_B,
     CASE WHEN x.PpAz_2_BE > 0 THEN x.PpAz_2_BE ELSE '-' END AS Pa_2_BE,
   
   CASE WHEN x.PpAz_0 > 0 THEN x.PpAz_0 ELSE '-' END AS Pp_ohne_erfolg      
 
 FROM(
/* Anfang Erste Bestandene Prüfung*/  
 SELECT
   CASE WHEN lppru.id_fsklnr = 50 AND
             lppru.bezeichnung IN ('Praxis','Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE    
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_1_AM, 
             
   CASE WHEN lppru.id_fsklnr = 13 AND   
             lppru.bezeichnung IN ('Praxis','Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE   
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_1_A1,  
     
   CASE WHEN lppru.id_fsklnr = 51 AND   
             lppru.bezeichnung IN ('Praxis','Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE    
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END  AS PpAz_1_A,
             
   CASE WHEN lppru.id_fsklnr = 53 AND   
             lppru.bezeichnung IN ('Praxis','Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE    
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_1_A2,
  
     CASE WHEN lppru.id_fsklnr = 15 AND
             lppru.bezeichnung IN ('Praxis','Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE    
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_1_B,
     
     CASE WHEN lppru.id_fsklnr = 16 AND
             lppru.bezeichnung IN ('Praxis','Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE    
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_1_BE,
                 
/* Anfang Zweite Bestandene Prüfung*/         
     CASE WHEN lppru.id_fsklnr = 50 AND
             lppru.bezeichnung IN ('WH Praxis','WH Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE    
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_2_AM, 
             
   CASE WHEN lppru.id_fsklnr = 13 AND   
             lppru.bezeichnung IN ('WH Praxis','WH Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE    
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_2_A1,  
     
   CASE WHEN lppru.id_fsklnr = 51 AND   
             lppru.bezeichnung IN ('WH Praxis','WH Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE    
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_2_A,
             
   CASE WHEN lppru.id_fsklnr = 53 AND   
             lppru.bezeichnung IN ('WH Praxis','WH Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE    
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END  AS PpAz_2_A2,
  
     CASE WHEN lppru.id_fsklnr = 15 AND
             lppru.bezeichnung IN ('WH Praxis','WH Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE    
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END  AS PpAz_2_B,
     
     CASE WHEN lppru.id_fsklnr = 16 AND
             lppru.bezeichnung IN ('WH Praxis','WH Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE    
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END  AS PpAz_2_BE,
         
/* Anfang Erste und Zweite Nicht Bestandene Prüfung*/
     CASE WHEN lppru.id_fsklnr IN (50,13,51,53,15,16) AND
             lppru.bezeichnung IN ('Praxis','Prüfung','WH Praxis','WH Prüfung') AND
                 lppru.id_prstatus = 2 AND
                 lppru.isUnterschrift = TRUE   
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END  AS PpAz_0         
       
FROM davidw2000._mtbl_leist AS leist
inner JOIN davidw2000._kde_leist AS lkde ON leist.id_flleist = lkde.id_flleist
INNER JOIN davidw2000._kde_leistpruefungpraxis AS lppru ON lkde.id_kdleist = lppru.id_kdleist
       

WHERE leist.id_nrmitar = 3
AND  leist.lsdate BETWEEN '2017-06-01 00:00:00' AND '2017-06-31 23:59:59'
GROUP BY
leist.lsdate
ORDER BY
leist.lsdate DESC) AS x[sql]
möchte ja auch nicht alles doppelt schreiben :)
```


----------



## Biber3 (20. August 2017)

Moin Technic1965,

so, jetzt habe ich noch mal draufgeschaut.

In dem Beitrag #20 (dem letzten Post auf Seite 1 dieses Threads) verwendest du doch schon den "passenden" LEFT JOIN innerhalb des "Summen-SELECTs" mit dem Alias x.

Dort steht doch u.a.


```
SELECT <irgendwas endgültig hybsch formatiertes>
 FROM (
   SELECT <viele Summenwerte mit Alias x>
FROM davidw2000._mtbl_leist AS leist
LEFT JOIN davidw2000._kde_leist               AS lkde  
    ON lkde.id_flleist   = leist.id_flleist
LEFT JOIN davidw2000._mtbl_leistsonstiges     AS lsonst
    ON lsonst.id_flleist = leist.id_flleist
LEFT JOIN davidw2000._kde_leistfahrstunden    AS lfahrs
    ON lkde.id_kdleist   = lfahrs.id_kdleist AND lfahrs.isUnterschrift = TRUE
LEFT JOIN davidw2000._kde_leistpruefungpraxis AS lprapru
    ON lkde.id_kdleist = lprapru.id_kdleist AND lprapru.isUnterschrift = TRUE
LEFT JOIN davidw2000._kde_leistfahrstunden    AS lfahrsUsF
    ON lkde.id_kdleist = lfahrsUsF.id_kdleist AND lfahrsUsF.isUnterschrift = FALSE
LEFT JOIN davidw2000._kde_leistpruefungpraxis AS lprapruUsF
   ON lkde.id_kdleist = lprapruUsF.id_kdleist AND lprapruUsF.isUnterschrift = FALSE
WHERE leist.id_nrmitar = 1
AND leist.lsdate BETWEEN '2017-06-01 00:00:00' AND '2017-06-30 23:59:59'
GROUP BY leist.lsdate
) AS x
....
```

Und dieser LEFT JOIN
...LEFT JOIN davidw2000._kde_leistpruefungpraxis AS lprapru
    ON lkde.id_kdleist = lprapru.id_kdleist AND lprapru.isUnterschrift = TRUE

... der ist doch genau derjenige, den du auch im zuletzt geposteten Statement benutzt.
Okay, der gewählte Alias ist im ersten Fall "lprapru" und in dem neuen Statement  "lppru", aber sonst....

Bau doch in das ältere Statement zum Test nur mal EINEN der Werte ein, innerhalb der Summen-Ermittlungsarie mit dem Alias x mit der auch sonst verwendetetn Mimik, z.B.

```
...
   SUM( CASE WHEN lprapru.id_fsklnr = 50 AND
             lprapru.bezeichnung IN ('Praxis','Prüfung') AND
                 lprapru.id_prstatus = 1
       -- AND  lprapru.isUnterschrift = TRUE /* Bedingung ist im JOIN */ 
         THEN 1  ELSE 0 END ) AS PpAz_1_AM,
  --  beispielsweise diesen hier
...
```

Den im inneren SELECT berechneten musst du im äußeren SELECT auch wieder in Empfang nehmen und anzeigen.

Wenn das funktioniert, dann kannst du die anderen Werte analog copy&pasten vom neuen Statment in das ältere.

Grüße
Biber


----------



## Technic1965 (20. August 2017)

Hi Biber,

hoffe du hattest einen schönen Urlaub, also das funktioniert je mehr es wird desto unübersichtlicher wird es 

```
SELECT       
       Date_Format(x.lsdate, '%d.%m.%Y') AS Ldatum,
       Anr.Text AS Anrede,
       stamm.mavname AS Vorname,
       stamm.maname AS Name,   
       
                     
  CASE WHEN 
       (SELECT SUM(ltheo.dauer)
        FROM davidw2000._mtbl_leist AS l
        INNER JOIN davidw2000._mtbl_leistunterricht AS ltheo ON l.id_flleist = ltheo.id_flleist    
        Where l.lsdate = x.lsdate
        AND l.id_nrmitar = x.id_nrmitar) > 0 
  Then
     (SELECT Ifnull(SUM(ltheo.dauer),0)
        FROM davidw2000._mtbl_leist AS l
        INNER JOIN davidw2000._mtbl_leistunterricht AS ltheo ON l.id_flleist = ltheo.id_flleist
        WHERE l.lsdate = x.lsdate
        AND l.id_nrmitar = x.id_nrmitar)
  ELSE '-' 
  END AS Theorie,
 
  CASE WHEN x.sumFahrs_Mofa = 0 THEN '-' ELSE x.sumFahrs_Mofa END AS Fahrs_Mofa,
  CASE WHEN x.sumFahrs_AM = 0 THEN '-' ELSE x.sumFahrs_AM END AS Fahrs_AM,
  CASE WHEN x.sumFahrs_A1 = 0 THEN '-' ELSE x.sumFahrs_A1 END AS Fahrs_A1,
  CASE WHEN x.sumFahrs_A = 0 THEN '-' ELSE x.sumFahrs_A END AS Fahrs_A,
  CASE WHEN x.sumFahrs_A2 = 0 THEN '-' ELSE x.sumFahrs_A2 END AS Fahrs_A2,  
  CASE WHEN x.sumFahrs_B = 0 THEN '-' ELSE x.sumFahrs_B END AS Fahrs_B,
  CASE WHEN x.sumFahrs_BE = 0 THEN '-' ELSE x.sumFahrs_BE END AS Fahrs_BE,
  CASE WHEN x.sumFahrs_B96 = 0 THEN '-' ELSE x.sumFahrs_B96 END AS Fahrs_B96,
  
  CASE WHEN x.sumPPru_AM = 0 THEN '-' ELSE x.sumPPru_AM END AS Prax_AM,
  CASE WHEN x.sumPPru_A1 = 0 THEN '-' ELSE x.sumPPru_A1 END AS Prax_A1,
  CASE WHEN x.sumPPru_A = 0 THEN '-' ELSE x.sumPPru_A END AS Prax_A,
  CASE WHEN x.sumPPru_A2 = 0 THEN '-' ELSE x.sumPPru_A2 END AS Prax_A2,  
  CASE WHEN x.sumPPru_B = 0 THEN '-' ELSE x.sumPPru_B END AS Prax_B,
  CASE WHEN x.sumPPru_BE = 0 THEN '-' ELSE x.sumPPru_BE END AS Prax_BE,
  CASE WHEN x.sumFahrs_Versaeumt > 0 THEN x.sumFahrs_Versaeumt ELSE '-' END AS Fahrs_Versaeumt,
  CASE WHEN x.sumPPruU_fehlt + x.sumFahrsU_fehlt > 0 THEN (x.sumPPruU_fehlt + x.sumFahrsU_fehlt) ELSE '-' END AS Uschrift_fehlt,  
  
  CASE WHEN
     (SELECT Ifnull(SUM(ltheo.dauer),0)
        FROM davidw2000._mtbl_leist AS l
        INNER JOIN davidw2000._mtbl_leistunterricht AS ltheo ON l.id_flleist = ltheo.id_flleist
        WHERE l.lsdate = x.lsdate
        AND l.id_nrmitar = x.id_nrmitar)+(x.sumFahrs_TagG)+(x.sumPPru_TagG) = 0
  THEN '-'
  ELSE 
        (SELECT Ifnull(SUM(ltheo.dauer),0)
        FROM davidw2000._mtbl_leist AS l
        INNER JOIN davidw2000._mtbl_leistunterricht AS ltheo ON l.id_flleist = ltheo.id_flleist
        WHERE l.lsdate = x.lsdate
        AND l.id_nrmitar = x.id_nrmitar)+(x.sumFahrs_TagG)+(x.sumPPru_TagG)
  END AS LTagG,
  
         
  CASE WHEN x.sumBu > 0 THEN x.sumBu ELSE '-' END AS Buro, 
  CASE WHEN x.sumPa > 0 THEN x.sumPa ELSE '-' END AS Pause,
  CASE WHEN x.sumSo > 0 THEN x.sumSo ELSE '-' END AS Sonstiges,      
  CASE WHEN x.sumUr > 0 THEN 'U' ELSE '-' END AS Urlaub,
  CASE WHEN x.sumKr > 0 THEN 'K' ELSE '-' END AS Krank,
  CASE WHEN x.SumFe > 0 THEN 'F' ELSE '-' END AS Feiertag

FROM (

/* inneres SELECT: alle Summenwerte aus einem SELECT von Tabelle "leist" mit allen ihren Childs */

SELECT  leist.id_nrmitar,
        leist.lsdate,               

/*Fahrstundenleistungen*/ 
  SUM(CASE WHEN lfahrs.is_fsklnr = 27
    THEN lfahrs.lsdauer
  ELSE 0 END ) AS sumFahrs_Mofa,
    
  SUM(CASE WHEN lfahrs.is_fsklnr = 50
    THEN lfahrs.lsdauer
  ELSE 0 END ) AS sumFahrs_AM,
    
  SUM(CASE WHEN lfahrs.is_fsklnr = 13
    THEN lfahrs.lsdauer
  ELSE 0 END ) AS sumFahrs_A1,
    
  SUM(CASE WHEN lfahrs.is_fsklnr = 51
    THEN lfahrs.lsdauer
  ELSE 0 END ) AS sumFahrs_A,
  
  SUM(CASE WHEN lfahrs.is_fsklnr = 53
    THEN lfahrs.lsdauer
  ELSE 0 END ) AS sumFahrs_A2,
    
  SUM(CASE WHEN lfahrs.is_fsklnr = 15
    THEN lfahrs.lsdauer
  ELSE 0 END ) AS sumFahrs_B,
  
  SUM(CASE WHEN lfahrs.is_fsklnr = 16
     THEN lfahrs.lsdauer
   ELSE 0 END ) AS sumFahrs_BE,
    
  SUM(CASE WHEN lfahrs.is_fsklnr = 52
     THEN lfahrs.lsdauer
   ELSE 0 END ) AS sumFahrs_B96,
   
  SUM(CASE WHEN lfahrs.lsdauer > 0
     THEN lfahrs.lsdauer
   ELSE 0 END ) AS sumFahrs_TagG,   
   
/*PraxisPrüfungsleistungen*/   
  SUM(CASE WHEN lppru.id_fsklnr = 50
    THEN lppru.lsdauer
  ELSE 0 END ) AS sumPPru_AM,
    
  SUM(CASE WHEN lppru.id_fsklnr = 13
    THEN lppru.lsdauer
  ELSE 0 END ) AS sumPPru_A1,
    
  SUM(CASE WHEN lppru.id_fsklnr = 51
    THEN lppru.lsdauer
  ELSE 0 END ) AS sumPPru_A,
  
  SUM(CASE WHEN lppru.id_fsklnr = 53
    THEN lppru.lsdauer
  ELSE 0 END ) AS sumPPru_A2,
    
  SUM(CASE WHEN lppru.id_fsklnr = 15
       THEN lppru.lsdauer
  ELSE 0 END) AS sumPPru_B,
    
  SUM(CASE WHEN lppru.id_fsklnr = 16
     THEN lppru.lsdauer
   ELSE 0 END ) AS sumPPru_BE,
   
  SUM(CASE WHEN lppru.lsdauer > 0
     THEN lppru.lsdauer
   ELSE 0 END ) AS sumPPru_TagG,   
   
   
  SUM(CASE WHEN lkde.id_lsart = 18
       AND lfahrs.isUnterschrift = False 
     THEN lfahrs.lsdauer
   ELSE 0 END ) AS sumFahrs_Versaeumt, 
   
  SUM(CASE WHEN lppru.isUnterschrift = False
   THEN lppru.lsdauer
   ELSE 0 END ) AS sumPPruU_fehlt, 
   
  SUM(CASE WHEN lfahrs.isUnterschrift = False
   THEN lfahrs.lsdauer
   ELSE 0 END ) AS sumFahrsU_fehlt,
       
   
/*Sonstigeleistungen*/      
  SUM(CASE WHEN lsonst.id_lsart = 30
       THEN lsonst.lsdauer
       ELSE 0 END ) AS sumBu,
       
  SUM(CASE WHEN lsonst.id_lsart = 36
       THEN lsonst.lsdauer
       ELSE 0 END ) AS sumPa,
       
  SUM(CASE WHEN lsonst.id_lsart = 34
       THEN lsonst.lsdauer
       ELSE 0 END ) AS sumSo,
    
  SUM(CASE WHEN lsonst.id_lsart = 38
       THEN lsonst.lsdauer
       ELSE 0 END ) AS sumUr,
  
  SUM(CASE WHEN lsonst.id_lsart = 40
       THEN lsonst.lsdauer
       ELSE 0 END ) AS SumKr,
    
  SUM(CASE WHEN lsonst.id_lsart = 42
       THEN lsonst.lsdauer
       ELSE 0 END ) AS SumFe

FROM davidw2000._mtbl_leist AS leist

/*
-- weitere JOINs .. (hier nicht wesentlich)
-- LEFT JOIN davidw2000._kde_leist...
-- LEFT JOIN davidw2000._mtbl_leistunterricht
*/
 

LEFT JOIN davidw2000._kde_leist AS lkde ON lkde.id_flleist = leist.id_flleist
LEFT JOIN davidw2000._mtbl_leistsonstiges AS lsonst ON lsonst.id_flleist = leist.id_flleist
LEFT JOIN davidw2000._kde_leistfahrstunden AS lfahrs  ON lkde.id_kdleist = lfahrs.id_kdleist AND lfahrs.isUnterschrift = True
LEFT JOIN  davidw2000._kde_leistpruefungpraxis AS lppru ON lkde.id_kdleist = lppru.id_kdleist AND lppru.isUnterschrift = True

WHERE leist.id_nrmitar = 3
AND  leist.lsdate BETWEEN '2017-07-01 00:00:00' AND '2017-07-31 23:59:59'
GROUP BY
leist.lsdate
ORDER BY
leist.lsdate DESC) AS x


INNER JOIN davidw2000._mtbl_stammdaten AS Stamm ON x.id_nrmitar = Stamm.id_mitar
INNER JOIN davidw2000._sys_anrede      AS Anr   ON Stamm.id_anrnr = Anr.id_anrnr[sql]
```

In Beitrag #24 muss das hier integriert werden da ich hier wieder INNER JOIN verwenden muss verstehe ich nicht, aber so funktioniert es, aber mit der  Abfrage  in Beitrag  #24 bekomme ich falsches Ergebnis

```
SELECT
   CASE WHEN X.PpAz_1_AM > 0 THEN x.PpAz_1_AM ELSE '-' END AS Pa_1_AM,
     CASE WHEN x.PpAz_1_A1 > 0 THEN x.PpAz_1_A1 ELSE '-' END AS Pa_1_A1,
     CASE WHEN x.PpAz_1_A > 0 THEN x.PpAz_1_A ELSE '-' END AS Pa_1_A,
     CASE WHEN x.PpAz_1_A2 > 0 THEN x.PpAz_1_A2 ELSE '-' END AS Pa_1_A2,
     CASE WHEN x.PpAz_1_B > 0 THEN x.PpAz_1_B ELSE '-' END AS Pa_1_B,
     CASE WHEN x.PpAz_1_BE > 0 THEN x.PpAz_1_BE ELSE '-' END AS Pa_1_BE,
  
   CASE WHEN x.PpAz_2_AM > 0 THEN x.PpAz_2_AM ELSE '-' END AS Pa_2_AM,
     CASE WHEN x.PpAz_2_A1 > 0 THEN x.PpAz_2_A1 ELSE '-' END AS Pa_2_A1,
     CASE WHEN x.PpAz_2_A > 0 THEN x.PpAz_2_A ELSE '-' END AS Pa_2_A,
     CASE WHEN x.PpAz_2_A2 > 0 THEN x.PpAz_2_A2 ELSE '-' END AS Pa_2_A2,
     CASE WHEN x.PpAz_2_B > 0 THEN x.PpAz_2_B ELSE '-' END AS Pa_2_B,
     CASE WHEN x.PpAz_2_BE > 0 THEN x.PpAz_2_BE ELSE '-' END AS Pa_2_BE,
 
   CASE WHEN x.PpAz_0 > 0 THEN x.PpAz_0 ELSE '-' END AS Pp_ohne_erfolg   
 
 FROM(
/* Anfang Erste Bestandene Prüfung*/
 SELECT
   CASE WHEN lppru.id_fsklnr = 50 AND
             lppru.bezeichnung IN ('Praxis','Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE 
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_1_AM,
          
   CASE WHEN lppru.id_fsklnr = 13 AND
             lppru.bezeichnung IN ('Praxis','Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_1_A1,
  
   CASE WHEN lppru.id_fsklnr = 51 AND
             lppru.bezeichnung IN ('Praxis','Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE 
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END  AS PpAz_1_A,
          
   CASE WHEN lppru.id_fsklnr = 53 AND
             lppru.bezeichnung IN ('Praxis','Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE 
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_1_A2,
 
     CASE WHEN lppru.id_fsklnr = 15 AND
             lppru.bezeichnung IN ('Praxis','Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE 
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_1_B,
  
     CASE WHEN lppru.id_fsklnr = 16 AND
             lppru.bezeichnung IN ('Praxis','Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE 
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_1_BE,
              
/* Anfang Zweite Bestandene Prüfung*/      
     CASE WHEN lppru.id_fsklnr = 50 AND
             lppru.bezeichnung IN ('WH Praxis','WH Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE 
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_2_AM,
          
   CASE WHEN lppru.id_fsklnr = 13 AND
             lppru.bezeichnung IN ('WH Praxis','WH Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE 
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_2_A1,
  
   CASE WHEN lppru.id_fsklnr = 51 AND
             lppru.bezeichnung IN ('WH Praxis','WH Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE 
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_2_A,
          
   CASE WHEN lppru.id_fsklnr = 53 AND
             lppru.bezeichnung IN ('WH Praxis','WH Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE 
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END  AS PpAz_2_A2,
 
     CASE WHEN lppru.id_fsklnr = 15 AND
             lppru.bezeichnung IN ('WH Praxis','WH Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE 
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END  AS PpAz_2_B,
  
     CASE WHEN lppru.id_fsklnr = 16 AND
             lppru.bezeichnung IN ('WH Praxis','WH Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE 
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END  AS PpAz_2_BE,
      
/* Anfang Erste und Zweite Nicht Bestandene Prüfung*/
     CASE WHEN lppru.id_fsklnr IN (50,13,51,53,15,16) AND
             lppru.bezeichnung IN ('Praxis','Prüfung','WH Praxis','WH Prüfung') AND
                 lppru.id_prstatus = 2 AND
                 lppru.isUnterschrift = TRUE
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END  AS PpAz_0      
    
FROM davidw2000._mtbl_leist AS leist
inner JOIN davidw2000._kde_leist AS lkde ON leist.id_flleist = lkde.id_flleist
INNER JOIN davidw2000._kde_leistpruefungpraxis AS lppru ON lkde.id_kdleist = lppru.id_kdleist
    

WHERE leist.id_nrmitar = 3
AND  leist.lsdate BETWEEN '2017-06-01 00:00:00' AND '2017-06-31 23:59:59'
GROUP BY
leist.lsdate
ORDER BY
leist.lsdate DESC) AS keine_Ahnung[sql]
```


----------



## Biber3 (22. August 2017)

Moin Technic1965,

Bitte erläutere mal das falsche Ergebnis.
Bei meinem Beispiel mit ppAz_1_AM sollten laut Plan die an diesem Tag gebuchten Wiederhol-Prüfungen berechnet werden.
Was kommt denn statt dessen raus?

Zum Thema Unübersichtlichkeit: ja, stimmt.
Bleibt nicht aus durch das nötige Pivotieren von mehreren Feldern. Könnten wir durch Verwendung von zwei Views etwas entschärfen, aber ich wollte erstmal die inhaltliche Richtigkeit sicherstellen.

Grüße 
Biber


----------



## Technic1965 (22. August 2017)

Hi Biber also dieses Statement läuft separat richtig und liefert mir auch die richtigen Ergebnisse also die Anzahl der Täglichen Prüfungen

```
SELECT
   CASE WHEN X.PpAz_1_AM > 0 THEN x.PpAz_1_AM ELSE '-' END AS Pa_1_AM,
     CASE WHEN x.PpAz_1_A1 > 0 THEN x.PpAz_1_A1 ELSE '-' END AS Pa_1_A1,
     CASE WHEN x.PpAz_1_A > 0 THEN x.PpAz_1_A ELSE '-' END AS Pa_1_A,
     CASE WHEN x.PpAz_1_A2 > 0 THEN x.PpAz_1_A2 ELSE '-' END AS Pa_1_A2,
     CASE WHEN x.PpAz_1_B > 0 THEN x.PpAz_1_B ELSE '-' END AS Pa_1_B,
     CASE WHEN x.PpAz_1_BE > 0 THEN x.PpAz_1_BE ELSE '-' END AS Pa_1_BE,
   
   CASE WHEN x.PpAz_2_AM > 0 THEN x.PpAz_2_AM ELSE '-' END AS Pa_2_AM,
     CASE WHEN x.PpAz_2_A1 > 0 THEN x.PpAz_2_A1 ELSE '-' END AS Pa_2_A1,
     CASE WHEN x.PpAz_2_A > 0 THEN x.PpAz_2_A ELSE '-' END AS Pa_2_A,
     CASE WHEN x.PpAz_2_A2 > 0 THEN x.PpAz_2_A2 ELSE '-' END AS Pa_2_A2,
     CASE WHEN x.PpAz_2_B > 0 THEN x.PpAz_2_B ELSE '-' END AS Pa_2_B,
     CASE WHEN x.PpAz_2_BE > 0 THEN x.PpAz_2_BE ELSE '-' END AS Pa_2_BE,
 
   CASE WHEN x.PpAz_0 > 0 THEN x.PpAz_0 ELSE '-' END AS Pp_ohne_erfolg    
 
 FROM(
/* Anfang Erste Bestandene Prüfung*/
 SELECT
   CASE WHEN lppru.id_fsklnr = 50 AND
             lppru.bezeichnung IN ('Praxis','Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE  
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_1_AM,
           
   CASE WHEN lppru.id_fsklnr = 13 AND 
             lppru.bezeichnung IN ('Praxis','Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE 
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_1_A1,
   
   CASE WHEN lppru.id_fsklnr = 51 AND 
             lppru.bezeichnung IN ('Praxis','Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE  
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END  AS PpAz_1_A,
           
   CASE WHEN lppru.id_fsklnr = 53 AND 
             lppru.bezeichnung IN ('Praxis','Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE  
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_1_A2,
 
     CASE WHEN lppru.id_fsklnr = 15 AND
             lppru.bezeichnung IN ('Praxis','Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE  
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_1_B,
   
     CASE WHEN lppru.id_fsklnr = 16 AND
             lppru.bezeichnung IN ('Praxis','Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE  
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_1_BE,
               
/* Anfang Zweite Bestandene Prüfung*/       
     CASE WHEN lppru.id_fsklnr = 50 AND
             lppru.bezeichnung IN ('WH Praxis','WH Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE  
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_2_AM,
           
   CASE WHEN lppru.id_fsklnr = 13 AND 
             lppru.bezeichnung IN ('WH Praxis','WH Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE  
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_2_A1,
   
   CASE WHEN lppru.id_fsklnr = 51 AND 
             lppru.bezeichnung IN ('WH Praxis','WH Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE  
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_2_A,
           
   CASE WHEN lppru.id_fsklnr = 53 AND 
             lppru.bezeichnung IN ('WH Praxis','WH Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE  
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END  AS PpAz_2_A2,
 
     CASE WHEN lppru.id_fsklnr = 15 AND
             lppru.bezeichnung IN ('WH Praxis','WH Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE  
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END  AS PpAz_2_B,
   
     CASE WHEN lppru.id_fsklnr = 16 AND
             lppru.bezeichnung IN ('WH Praxis','WH Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE  
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END  AS PpAz_2_BE,
       
/* Anfang Erste und Zweite Nicht Bestandene Prüfung*/
     CASE WHEN lppru.id_fsklnr IN (50,13,51,53,15,16) AND
             lppru.bezeichnung IN ('Praxis','Prüfung','WH Praxis','WH Prüfung') AND
                 lppru.id_prstatus = 2 AND
                 lppru.isUnterschrift = TRUE 
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END  AS PpAz_0       
     
FROM davidw2000._mtbl_leist AS leist
inner JOIN davidw2000._kde_leist AS lkde ON leist.id_flleist = lkde.id_flleist
INNER JOIN davidw2000._kde_leistpruefungpraxis AS lppru ON lkde.id_kdleist = lppru.id_kdleist
     

WHERE leist.id_nrmitar = 3
AND  leist.lsdate BETWEEN '2017-06-01 00:00:00' AND '2017-06-31 23:59:59'
GROUP BY
leist.lsdate
ORDER BY
leist.lsdate DESC) AS x[SQL]
```

Bildlich sieht das so aus



sieht aber Anfänger mäßig aus und müsste diesen auch in das vorherige einbinden, aber dann bekomme ich die Anzahl nicht.
habe noch etwas zusammen gereimt, die funktioniert, aber dauert lange und alles mehrmals geschrieben

Also hier mal alles komplett, leider bekomme ich nicht die richtige Anzahl der Prüfungen.

```
SELECT 
       Date_Format(DATE_SUB(x.lsdate, INTERVAL 13 Week), '%d.%m.%Y') AS 13_Wochen_vor_Ldatum, 
   Date_Format(x.lsdate, '%d.%m.%Y') AS Ldatum,
       Anr.Text AS Anrede,
       stamm.mavname AS Vorname,
       stamm.maname AS Name,   
       
                     
  CASE WHEN 
       (SELECT SUM(ltheo.dauer)
        FROM davidw2000._mtbl_leist AS l
        INNER JOIN davidw2000._mtbl_leistunterricht AS ltheo ON l.id_flleist = ltheo.id_flleist    
        Where l.lsdate = x.lsdate
        AND l.id_nrmitar = x.id_nrmitar) > 0 
  Then
     (SELECT Ifnull(SUM(ltheo.dauer),0)
        FROM davidw2000._mtbl_leist AS l
        INNER JOIN davidw2000._mtbl_leistunterricht AS ltheo ON l.id_flleist = ltheo.id_flleist
        WHERE l.lsdate = x.lsdate
        AND l.id_nrmitar = x.id_nrmitar)
  ELSE '-' 
  END AS Theorie,
       
     CASE WHEN x.sumFahrs_Mofa = 0 THEN '-' ELSE x.sumFahrs_Mofa END AS Fahrs_Mofa,
     CASE WHEN x.sumFahrs_AM = 0 THEN '-' ELSE x.sumFahrs_AM END AS Fahrs_AM,
     CASE WHEN x.sumFahrs_A1 = 0 THEN '-' ELSE x.sumFahrs_A1 END AS Fahrs_A1,
     CASE WHEN x.sumFahrs_A = 0 THEN '-' ELSE x.sumFahrs_A END AS Fahrs_A,
     CASE WHEN x.sumFahrs_A2 = 0 THEN '-' ELSE x.sumFahrs_A2 END AS Fahrs_A2,  
     CASE WHEN x.sumFahrs_B = 0 THEN '-' ELSE x.sumFahrs_B END AS Fahrs_B,
     CASE WHEN x.sumFahrs_BE = 0 THEN '-' ELSE x.sumFahrs_BE END AS Fahrs_BE,
     CASE WHEN x.sumFahrs_B96 = 0 THEN '-' ELSE x.sumFahrs_B96 END AS Fahrs_B96,
  
     CASE WHEN x.sumPPru_AM = 0 THEN '-' ELSE x.sumPPru_AM END AS Prax_AM,
     CASE WHEN x.sumPPru_A1 = 0 THEN '-' ELSE x.sumPPru_A1 END AS Prax_A1,
     CASE WHEN x.sumPPru_A = 0 THEN '-' ELSE x.sumPPru_A END AS Prax_A,
     CASE WHEN x.sumPPru_A2 = 0 THEN '-' ELSE x.sumPPru_A2 END AS Prax_A2,  
     CASE WHEN x.sumPPru_B = 0 THEN '-' ELSE x.sumPPru_B END AS Prax_B,
     CASE WHEN x.sumPPru_BE = 0 THEN '-' ELSE x.sumPPru_BE END AS Prax_BE,
     
     CASE WHEN X.PpAz_1_AM > 0 THEN x.PpAz_1_AM ELSE '-' END AS Pa_1_AM,
     CASE WHEN x.PpAz_1_A1 > 0 THEN x.PpAz_1_A1 ELSE '-' END AS Pa_1_A1,
     CASE WHEN x.PpAz_1_A > 0 THEN x.PpAz_1_A ELSE '-' END AS Pa_1_A,
     CASE WHEN x.PpAz_1_A2 > 0 THEN x.PpAz_1_A2 ELSE '-' END AS Pa_1_A2,  
     CASE WHEN x.PpAz_1_B > 0 THEN x.PpAz_1_B ELSE '-' END AS Pa_1_B,
     CASE WHEN x.PpAz_1_BE > 0 THEN x.PpAz_1_BE ELSE '-' END AS Pa_1_BE,
     
   CASE WHEN x.PpAz_2_AM > 0 THEN x.PpAz_2_AM ELSE '-' END AS Pa_2_AM,
     CASE WHEN x.PpAz_2_A1 > 0 THEN x.PpAz_2_A1 ELSE '-' END AS Pa_2_A1,
     CASE WHEN x.PpAz_2_A > 0 THEN x.PpAz_2_A ELSE '-' END AS Pa_2_A,
     CASE WHEN x.PpAz_2_A2 > 0 THEN x.PpAz_2_A2 ELSE '-' END AS Pa_2_A2,  
     CASE WHEN x.PpAz_2_B > 0 THEN x.PpAz_2_B ELSE '-' END AS Pa_2_B,
     CASE WHEN x.PpAz_2_BE > 0 THEN x.PpAz_2_BE ELSE '-' END AS Pa_2_BE,
   CASE WHEN x.PpAz_0 > 0 THEN x.PpAz_0 ELSE '-' END AS Pp_ohne_erfolg ,
     
     CASE WHEN x.sumFahrs_Versaeumt > 0 THEN x.sumFahrs_Versaeumt ELSE '-' END AS Fahrs_Versaeumt,
     CASE WHEN x.sumPPruU_fehlt + x.sumFahrsU_fehlt > 0 THEN (x.sumPPruU_fehlt + x.sumFahrsU_fehlt) ELSE '-' END AS Uschrift_fehlt,  
  
  CASE WHEN
     (SELECT Ifnull(SUM(ltheo.dauer),0)
        FROM davidw2000._mtbl_leist AS l
        INNER JOIN davidw2000._mtbl_leistunterricht AS ltheo ON l.id_flleist = ltheo.id_flleist
        WHERE l.lsdate = x.lsdate
        AND l.id_nrmitar = x.id_nrmitar)+(x.sumFahrs_TagG)+(x.sumPPru_TagG) = 0
  THEN '-'
  ELSE 
        (SELECT Ifnull(SUM(ltheo.dauer),0)
        FROM davidw2000._mtbl_leist AS l
        INNER JOIN davidw2000._mtbl_leistunterricht AS ltheo ON l.id_flleist = ltheo.id_flleist
        WHERE l.lsdate = x.lsdate
        AND l.id_nrmitar = x.id_nrmitar)+(x.sumFahrs_TagG)+(x.sumPPru_TagG)
  END AS LTagG,
  
         
  CASE WHEN x.sumBu > 0 THEN x.sumBu ELSE '-' END AS Buro, 
  CASE WHEN x.sumPa > 0 THEN x.sumPa ELSE '-' END AS Pause,
  CASE WHEN x.sumSo > 0 THEN x.sumSo ELSE '-' END AS Sonstiges,      
  CASE WHEN x.sumUr > 0 THEN 'U' ELSE '-' END AS Urlaub,
  CASE WHEN x.sumKr > 0 THEN 'K' ELSE '-' END AS Krank,
  CASE WHEN x.SumFe > 0 THEN 'F' ELSE '-' END AS Feiertag

FROM (

/* inneres SELECT: alle Summenwerte aus einem SELECT von Tabelle "leist" mit allen ihren Childs */

SELECT  leist.id_nrmitar,
        leist.lsdate, 
    
   

    
    
    
    
                   

/*Fahrstundenleistungen*/ 
  SUM(CASE WHEN lfahrs.is_fsklnr = 27
    THEN lfahrs.lsdauer
  ELSE 0 END ) AS sumFahrs_Mofa,
    
  SUM(CASE WHEN lfahrs.is_fsklnr = 50
    THEN lfahrs.lsdauer
  ELSE 0 END ) AS sumFahrs_AM,
    
  SUM(CASE WHEN lfahrs.is_fsklnr = 13
    THEN lfahrs.lsdauer
  ELSE 0 END ) AS sumFahrs_A1,
    
  SUM(CASE WHEN lfahrs.is_fsklnr = 51
    THEN lfahrs.lsdauer
  ELSE 0 END ) AS sumFahrs_A,
  
  SUM(CASE WHEN lfahrs.is_fsklnr = 53
    THEN lfahrs.lsdauer
  ELSE 0 END ) AS sumFahrs_A2,
    
  SUM(CASE WHEN lfahrs.is_fsklnr = 15
    THEN lfahrs.lsdauer
  ELSE 0 END ) AS sumFahrs_B,
  
  SUM(CASE WHEN lfahrs.is_fsklnr = 16
     THEN lfahrs.lsdauer
   ELSE 0 END ) AS sumFahrs_BE,
    
  SUM(CASE WHEN lfahrs.is_fsklnr = 52
     THEN lfahrs.lsdauer
   ELSE 0 END ) AS sumFahrs_B96,
   
  SUM(CASE WHEN lfahrs.lsdauer > 0
     THEN lfahrs.lsdauer
   ELSE 0 END ) AS sumFahrs_TagG,   
   
/*PraxisPrüfungsleistungen*/   
  SUM(CASE WHEN lppru.id_fsklnr = 50
    THEN lppru.lsdauer
  ELSE 0 END ) AS sumPPru_AM,
    
  SUM(CASE WHEN lppru.id_fsklnr = 13
    THEN lppru.lsdauer
  ELSE 0 END ) AS sumPPru_A1,
    
  SUM(CASE WHEN lppru.id_fsklnr = 51
    THEN lppru.lsdauer
  ELSE 0 END ) AS sumPPru_A,
  
  SUM(CASE WHEN lppru.id_fsklnr = 53
    THEN lppru.lsdauer
  ELSE 0 END ) AS sumPPru_A2,
    
  SUM(CASE WHEN lppru.id_fsklnr = 15
       THEN lppru.lsdauer
  ELSE 0 END) AS sumPPru_B,
    
  SUM(CASE WHEN lppru.id_fsklnr = 16
     THEN lppru.lsdauer
   ELSE 0 END ) AS sumPPru_BE,
   
  SUM(CASE WHEN lppru.lsdauer > 0
     THEN lppru.lsdauer
   ELSE 0 END ) AS sumPPru_TagG,   
   
   
  SUM(CASE WHEN lkde.id_lsart = 18
       AND lfahrs.isUnterschrift = False 
     THEN lfahrs.lsdauer
   ELSE 0 END ) AS sumFahrs_Versaeumt, 
   
  SUM(CASE WHEN lppru.isUnterschrift = False
   THEN lppru.lsdauer
   ELSE 0 END ) AS sumPPruU_fehlt, 
   
  SUM(CASE WHEN lfahrs.isUnterschrift = False
   THEN lfahrs.lsdauer
   ELSE 0 END ) AS sumFahrsU_fehlt,
   CASE WHEN lppru.id_fsklnr = 50 AND
             lppru.bezeichnung IN ('Praxis','Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE    
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_1_AM, 
             
   CASE WHEN lppru.id_fsklnr = 13 AND   
             lppru.bezeichnung IN ('Praxis','Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE   
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_1_A1,  
     
   CASE WHEN lppru.id_fsklnr = 51 AND   
             lppru.bezeichnung IN ('Praxis','Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE    
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END  AS PpAz_1_A,
             
   CASE WHEN lppru.id_fsklnr = 53 AND   
             lppru.bezeichnung IN ('Praxis','Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE    
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_1_A2,
  
     CASE WHEN lppru.id_fsklnr = 15 AND
             lppru.bezeichnung IN ('Praxis','Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE    
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_1_B,
     
     CASE WHEN lppru.id_fsklnr = 16 AND
             lppru.bezeichnung IN ('Praxis','Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE    
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_1_BE,
                 
/* Anfang Zweite Bestandene Prüfung*/         
     CASE WHEN lppru.id_fsklnr = 50 AND
             lppru.bezeichnung IN ('WH Praxis','WH Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE    
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_2_AM, 
             
   CASE WHEN lppru.id_fsklnr = 13 AND   
             lppru.bezeichnung IN ('WH Praxis','WH Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE    
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_2_A1,  
     
   CASE WHEN lppru.id_fsklnr = 51 AND   
             lppru.bezeichnung IN ('WH Praxis','WH Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE    
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_2_A,
             
   CASE WHEN lppru.id_fsklnr = 53 AND   
             lppru.bezeichnung IN ('WH Praxis','WH Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE    
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END  AS PpAz_2_A2,
  
     CASE WHEN lppru.id_fsklnr = 15 AND
             lppru.bezeichnung IN ('WH Praxis','WH Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE    
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END  AS PpAz_2_B,
     
     CASE WHEN lppru.id_fsklnr = 16 AND
             lppru.bezeichnung IN ('WH Praxis','WH Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE    
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END  AS PpAz_2_BE,
         
/* Anfang Erste und Zweite Nicht Bestandene Prüfung*/
     CASE WHEN lppru.id_fsklnr IN (50,13,51,53,15,16) AND
             lppru.bezeichnung IN ('Praxis','Prüfung','WH Praxis','WH Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE   
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END  AS PpAz_0 ,   
       
   
/*Sonstigeleistungen*/      
  SUM(CASE WHEN lsonst.id_lsart = 30
       THEN lsonst.lsdauer
       ELSE 0 END ) AS sumBu,
       
  SUM(CASE WHEN lsonst.id_lsart = 36
       THEN lsonst.lsdauer
       ELSE 0 END ) AS sumPa,
       
  SUM(CASE WHEN lsonst.id_lsart = 34
       THEN lsonst.lsdauer
       ELSE 0 END ) AS sumSo,
    
  SUM(CASE WHEN lsonst.id_lsart = 38
       THEN lsonst.lsdauer
       ELSE 0 END ) AS sumUr,
  
  SUM(CASE WHEN lsonst.id_lsart = 40
       THEN lsonst.lsdauer
       ELSE 0 END ) AS SumKr,
    
  SUM(CASE WHEN lsonst.id_lsart = 42
       THEN lsonst.lsdauer
       ELSE 0 END ) AS SumFe

FROM davidw2000._mtbl_leist AS leist

/*
-- weitere JOINs .. (hier nicht wesentlich)
-- LEFT JOIN davidw2000._kde_leist...
-- LEFT JOIN davidw2000._mtbl_leistunterricht
*/
 

LEFT JOIN davidw2000._kde_leist AS lkde ON lkde.id_flleist = leist.id_flleist
LEFT JOIN davidw2000._mtbl_leistsonstiges AS lsonst ON lsonst.id_flleist = leist.id_flleist
LEFT JOIN davidw2000._kde_leistfahrstunden AS lfahrs  ON lkde.id_kdleist = lfahrs.id_kdleist AND lfahrs.isUnterschrift = True
LEFT JOIN  davidw2000._kde_leistpruefungpraxis AS lppru ON lkde.id_kdleist = lppru.id_kdleist AND lppru.isUnterschrift = True

/*INNER JOIN  davidw2000._kde_leistpruefungpraxis AS PPcount ON kdecount.id_kdleist = PPcount.id_kdleist AND PPcount.isUnterschrift = True*/

WHERE leist.id_nrmitar = 3
AND  leist.lsdate BETWEEN '2017-06-01 00:00:00' AND '2017-06-31 23:59:59'
GROUP BY
leist.lsdate
ORDER BY
leist.lsdate DESC) AS x


INNER JOIN davidw2000._mtbl_stammdaten AS Stamm ON x.id_nrmitar = Stamm.id_mitar
INNER JOIN davidw2000._sys_anrede      AS Anr   ON Stamm.id_anrnr = Anr.id_anrnr[SQL]
```

Währe also die Tabellen Verbindung Inner Join, dann würde es funktionieren, wenn ich das aber ändere dann funktionier anderer teil nicht, also nur für die Count abfragen benötige ich INNER JOIN  für die
"*LEFT* *JOIN* davidw2000._kde_leistpruefungpraxis *AS* lppru *ON* lkde.id_kdleist = lppru.id_kdleist *AND* lppru.isUnterschrift = *True*"
sonst LEFT JOIN, ich hoffe das ich es diesmal erklären konnte.


----------



## Biber3 (22. August 2017)

Na ja,

ich sehe den Unterschied schon - beim INNER JOIN bekommst du natürlich nur die 7 Tage, an denen auch auch eine Wiederhol-Prüfung stattfand, ausgegeben (Leider lässt du den Tag nicht mit ausgeben; das macht den direkten Vergleich schwieriger).
Aber du willst doch diese Ergebnisse mit in der anderen Auswertung ausgeben, und diese andere Liste ist doch so strukturiert, dass alle Tage, an denen ein Fahrlehrer irgendwelche Buchungen hatte, aufgeführt werden.

Wenn du jetzt in der neuen Abfrage (der mit INNER JOIN) das Datum lsdate mit anzeigen lässt und dabei z.B am 17.Juni. 2 Wh-Prüfungen xy angezeigt werden, dann sollten diese doch genau mit einem LEFT JOIN in der ersten Abfrage (wie in meinem Beispiel von Sonntag mit SUM(CASE WHEN...END) ) für genau diesen Tag herauskommen.

Was NICHT funktionieren kann, ist eine Änderung in der alten Abfrage auf INNER JOIN, da gebe ich dir recht.

Das Problem, was ich vermeiden will, ist folgendes:
Mit der tippaufwendigen Strategie mit innerem Select für Summierung und Pivotierung und einem äußeren Select für die optisch-ästhetische Aufhübschung kommen wir mit genau einer Stelle aus, an der die WHERE-Bedingung eingetippt/geändert werden muss. Und es wird an der frühest möglichen Stelle gefiltert auf EINEN Mitarbeiter und EINEN Monat (oder Zeitraum).

Wenn wir, was die Alternative wäre, ein paar Hilfsviews bauen
- einen View für Summierung/Pivotierung von _kde_leistfahrstunden/_mtbl_leistsonstiges (= altes inneres SELECT)
- einem View für Summierung/Pivotierung von _kde_leistpruefungpraxis (dein neues Statement)
-> dann sollten in beiden Views die Felder lsdate/id_nrmitar enthalten sein, weil die Views über diese beiden Felder verjoint werden müssen (das ist unproblematisch)
-> aber: beide Views würden jeweils die Werte über ALLE Mitarbeiter und ALLE Zeiträume berechnen müssen , da die WHERE-Bedingung erst nach dem JOIN der Views erfolgen kann (in den Views kann keine WHERE Klausel sein)

Dazu sollten wir aber erstmal auf alle Tabellen, die ein lsdate und eine Mitarbeiter-Nummer enthalten, einen Non-Unique-Index auf diese Feldkombination anlegen und prüfen, wie lange so eine Abfrage "über alles" braucht (also z.B. deine neue Abfrage MIT Anzeige von Datum und Mitarbeiter GROUP BY Datum und Mitarbeiter OHNE ORDER BY und vor allem OHNE WHERE-Klausel).

Noch mal: ich bin immer noch überzeugt davon, dass wir auch mit dem vorhanden LEFT JOIN weiterkommen,
Bitte lass mal in deinem neuen Statement das Datum mit anzeigen, damit wir wenigstens die Werte/die Abweichungen eines bestimmtes Tages vergleichen können.

Grüße
Biber
[Edit]
zu dem "in den Views kann keine WHERE Klausel sein"
Natürlich KANN in einem View eine WHERE-Klausel sein. Aber bei einer Änderung der WHERE-Bedingung muss jedesmal der View gedropped/neu angelegt werden. das ist nicht praktibel. 
[/Edit]


----------



## Technic1965 (23. August 2017)

Hi Biber,
gerne mache ich den Ablauf weiter wie du es empfählst, da ich ja auch was davon lerne, hier erstmal das was du sehen wolltest, wenn dieses mit left join funktionieren würde   wäre es toll, also ich poste mal erst das funktionierende teil für die Prüfungsanzahl

```
SELECT
   Date_Format(x.lsdate, '%d.%m.%Y') AS Ldatum,
   
   CASE WHEN X.PpAz_1_AM > 0 THEN x.PpAz_1_AM ELSE '-' END AS Pa_1_AM,
     CASE WHEN x.PpAz_1_A1 > 0 THEN x.PpAz_1_A1 ELSE '-' END AS Pa_1_A1,
     CASE WHEN x.PpAz_1_A > 0 THEN x.PpAz_1_A ELSE '-' END AS Pa_1_A,
     CASE WHEN x.PpAz_1_A2 > 0 THEN x.PpAz_1_A2 ELSE '-' END AS Pa_1_A2, 
     CASE WHEN x.PpAz_1_B > 0 THEN x.PpAz_1_B ELSE '-' END AS Pa_1_B,
     CASE WHEN x.PpAz_1_BE > 0 THEN x.PpAz_1_BE ELSE '-' END AS Pa_1_BE,
     
   CASE WHEN x.PpAz_2_AM > 0 THEN x.PpAz_2_AM ELSE '-' END AS Pa_2_AM,
     CASE WHEN x.PpAz_2_A1 > 0 THEN x.PpAz_2_A1 ELSE '-' END AS Pa_2_A1,
     CASE WHEN x.PpAz_2_A > 0 THEN x.PpAz_2_A ELSE '-' END AS Pa_2_A,
     CASE WHEN x.PpAz_2_A2 > 0 THEN x.PpAz_2_A2 ELSE '-' END AS Pa_2_A2, 
     CASE WHEN x.PpAz_2_B > 0 THEN x.PpAz_2_B ELSE '-' END AS Pa_2_B,
     CASE WHEN x.PpAz_2_BE > 0 THEN x.PpAz_2_BE ELSE '-' END AS Pa_2_BE,
   
   CASE WHEN x.PpAz_0 > 0 THEN x.PpAz_0 ELSE '-' END AS Pp_ohne_erfolg     
 FROM(
/* Anfang Erste Bestandene Prüfung*/ 
 SELECT
 leist.lsdate,
   CASE WHEN lppru.id_fsklnr = 50 AND
             lppru.bezeichnung IN ('Praxis','Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE    
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_1_AM,
             
   CASE WHEN lppru.id_fsklnr = 13 AND   
             lppru.bezeichnung IN ('Praxis','Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE   
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_1_A1, 
     
   CASE WHEN lppru.id_fsklnr = 51 AND   
             lppru.bezeichnung IN ('Praxis','Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE    
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END  AS PpAz_1_A,
             
   CASE WHEN lppru.id_fsklnr = 53 AND   
             lppru.bezeichnung IN ('Praxis','Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE    
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_1_A2,
 
     CASE WHEN lppru.id_fsklnr = 15 AND
             lppru.bezeichnung IN ('Praxis','Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE    
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_1_B,
     
     CASE WHEN lppru.id_fsklnr = 16 AND
             lppru.bezeichnung IN ('Praxis','Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE    
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_1_BE,
                 
/* Anfang Zweite Bestandene Prüfung*/         
     CASE WHEN lppru.id_fsklnr = 50 AND
             lppru.bezeichnung IN ('WH Praxis','WH Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE    
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_2_AM,
             
   CASE WHEN lppru.id_fsklnr = 13 AND   
             lppru.bezeichnung IN ('WH Praxis','WH Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE    
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_2_A1, 
     
   CASE WHEN lppru.id_fsklnr = 51 AND   
             lppru.bezeichnung IN ('WH Praxis','WH Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE    
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END AS PpAz_2_A,
             
   CASE WHEN lppru.id_fsklnr = 53 AND   
             lppru.bezeichnung IN ('WH Praxis','WH Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE    
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END  AS PpAz_2_A2,
 
     CASE WHEN lppru.id_fsklnr = 15 AND
             lppru.bezeichnung IN ('WH Praxis','WH Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE    
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END  AS PpAz_2_B,
     
     CASE WHEN lppru.id_fsklnr = 16 AND
             lppru.bezeichnung IN ('WH Praxis','WH Prüfung') AND
                 lppru.id_prstatus = 1 AND
                 lppru.isUnterschrift = TRUE    
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END  AS PpAz_2_BE,
         
/* Anfang Erste und Zweite Nicht Bestandene Prüfung*/
     CASE WHEN lppru.id_fsklnr IN (50,13,51,53,15,16) AND
             lppru.bezeichnung IN ('Praxis','Prüfung','WH Praxis','WH Prüfung') AND
                 lppru.id_prstatus = 2 AND
                 lppru.isUnterschrift = TRUE   
         THEN COUNT(lppru.bezeichnung)
         ELSE 0 END  AS PpAz_0         
       
FROM davidw2000._mtbl_leist AS leist
INNER JOIN davidw2000._kde_leist AS lkde ON leist.id_flleist = lkde.id_flleist
INNER JOIN davidw2000._kde_leistpruefungpraxis AS lppru ON lkde.id_kdleist = lppru.id_kdleist
[sql]
```







So muss das Ergebnis aussehen



So Fehlt eine Anzahl also die 2 Ohne Erfolg am 17.08.2017



hier fehlt wieder eine 08.08.2017 ohne erfolg



und hier ist die fehlende am 08.08.2017



Was ich nicht verstehe ist, das Zeiten in Min übermit Left Join funktionieren


```
LEFT JOIN davidw2000._kde_leistfahrstunden AS lfahrs ON lkde.id_kdleist = lfahrs.id_kdleist
LEFT JOIN davidw2000._kde_leistpruefungpraxis AS lppru ON lppru.id_kdleist = lkde.id_kdleist
[sql]
wenn ich aber die Anzahl möchte muss ich mit INNER Join verbinden, obwohl die gleiche Tabelle, nur nicht die Summe sondern COUNT
[Code=SQL]INNER JOIN davidw2000._kde_leistpruefungpraxis AS lppru ON lppru.id_kdleist = lkde.id_kdleist[sql]

[Code=sql]
SUM(CASE WHEN lppru.id_fsklnr = 15
AND lppru.isUnterschrift = TRUE
THEN lppru.lsdauer
ELSE 0 END) AS sumPPru_B,[sql]

[Code=sql]
CASE WHEN lppru.id_fsklnr = 15 AND
lppru.bezeichnung IN ('WH Praxis','WH Prüfung') AND
lppru.id_prstatus = 1 AND
lppru.isUnterschrift = TRUE
THEN COUNT(lppru.bezeichnung)
ELSE 0 END AS PpAz_2_B,
[sql]
```


----------



## Biber3 (23. August 2017)

Moin Technic1965,

einmal nerve ich noch mit dem "es muss einfach mit LEFT JOIN funktionieren", danach probieren wir was anderes.

Was mir auffiel:
a) bei dem Bild überschrieben mit "So muss es aussehen" fragst du den Mitarbeiter 1 ab; bei dem Bild darunter miskommentiertet "hier fehlt der soundsovielte August" fragst du Mitarbeiter 3 ab?

b) unabhängig davon: bitte versuche die Pivotierung nach dem selben Schema wie wir es bei den Stunden gemacht haben und wie ich es weiter oben vorschlug.

Also ersetze (NUR bei einem einzigen Fall erstmal) das auskommentierte durch das darunter stehende.
Is' sich auch der letzte Versuch...


```
...
END  AS PpAz_2_BE,
         
/* Deine Summenberechnung Anfang Erste und Zweite Nicht Bestandene Prüfung*/
-- nur diesen einen Fall anpassen
--     CASE WHEN lppru.id_fsklnr IN (50,13,51,53,15,16) AND
--             lppru.bezeichnung IN ('Praxis','Prüfung','WH Praxis','WH Prüfung') AND
--                 lppru.id_prstatus = 2 AND
--                 lppru.isUnterschrift = TRUE  
--         THEN COUNT(lppru.bezeichnung)
--         ELSE 0 END  AS PpAz_0       
/* Meine Summenberechnung Anfang Erste und Zweite Nicht Bestandene Prüfung*/

     Sum(CASE WHEN lppru.id_fsklnr IN (50,13,51,53,15,16)
         AND lppru.bezeichnung IN ('Praxis','Prüfung','WH Praxis','WH Prüfung')
         AND lppru.id_prstatus = 2 AND lppru.isUnterschrift = TRUE  
         THEN 1
         ELSE 0 END)  AS PpAz_0       

       
FROM davidw2000._mtbl_leist AS leist
INNER JOIN davidw2000._kde_leist AS lkde ON leist.id_flleist = lkde.id_flleist
LEFT JOIN davidw2000._kde_leistpruefungpraxis AS lppru ON lkde.id_kdleist = lppru.id_kdleist
..
```

Is' mir ja auch langsam peinlich, dass ich nich' ma ein paar Prüfungen zusammenzählen kann.

Grüße
Biber


----------



## Technic1965 (26. August 2017)

Biber3 hat gesagt.:


> einmal nerve ich noch mit dem "es muss einfach mit LEFT JOIN funktionieren", danach probieren wir was anderes.


Verdammt  es hat funktioniert, hat mir alles gezählt auch mit LEFT JOIN 

mir fallen die Augen zu, morgen 07:30 Uhr Prüfung, danach habe ich paar Std. Zeit, dann schau ich mal, wo der Kampf weiter geht.
Herzlichen Dank SENSEI 



Biber3 hat gesagt.:


> *THEN* 1


Aber das wäre mir nicht eingefallen, lässt einfach die "1" Summieren, konnte es jetzt vielleicht nicht richtig kommentieren aber ich habe es verstanden, ohne Count()  Perfect





	

		
			
		

		
	
 Hi Biber,
soweit läuft alles gut, bei der Prüfungsanzahl möchte ich etwas ergänzen sonst lege ich mich selber rein mit dem was ich mache.
Also mit dieser Abfrage, bei der Prüfung oder Praxis Ergebnissen ist alles ok, bei WH Praxis oder WH Prüfung werden auch 2. 3. 4. 5. und auch weitere Prüfungen angezeigt auch wenn die Prüf beim 20. Anlauf bestanden wird, also sollte über die "id_kd" geprüft werden wie viele WH Praxis oder WH Prüfung der Kunde wiederholt hat, mehr als eine WH P sollte nicht unter "Pa_2_B" angezeigt werden sondern unter "Pp_ohne_erfolg" mitgezählt werden. Ich weiss ich nerve  

```
SELECT
       Date_Format(DATE_SUB(x.lsdate, INTERVAL 13 Week), '%d.%m.%Y') AS Wochen_13_vor_Ldatum,
   Date_Format(x.lsdate, '%d.%m.%Y') AS Ldatum,
       Anr.Text AS Anrede,
       stamm.mavname AS Vorname,
       stamm.maname AS Name,    
                     
  CASE WHEN
       (SELECT SUM(ltheo.dauer)
        FROM davidw2000._mtbl_leist AS l
        INNER JOIN davidw2000._mtbl_leistunterricht AS ltheo ON l.id_flleist = ltheo.id_flleist  
        Where l.lsdate = x.lsdate
        AND l.id_nrmitar = x.id_nrmitar) > 0
  Then
     (SELECT Ifnull(SUM(ltheo.dauer),0)
        FROM davidw2000._mtbl_leist AS l
        INNER JOIN davidw2000._mtbl_leistunterricht AS ltheo ON l.id_flleist = ltheo.id_flleist
        WHERE l.lsdate = x.lsdate
        AND l.id_nrmitar = x.id_nrmitar)
  ELSE '-'
  END AS Theorie,

     CASE WHEN x.PpAz_1_A2 > 0 THEN x.PpAz_1_A2 ELSE '-' END AS Pa_1_A2,
     CASE WHEN x.PpAz_1_B > 0 THEN x.PpAz_1_B ELSE '-' END AS Pa_1_B,
     
     CASE WHEN x.PpAz_2_B > 0 THEN x.PpAz_2_B ELSE '-' END AS Pa_2_B,
   CASE WHEN x.PpAz_0 > 0 THEN x.PpAz_0 ELSE '-' END AS Pp_ohne_erfolg
   
       
FROM (

SELECT  leist.id_nrmitar,
        leist.lsdate,

 SUM(CASE WHEN lppru.id_fsklnr = 53 
         AND lppru.bezeichnung IN ('Praxis','Prüfung')
             AND lppru.id_prstatus = 1
             AND lppru.isUnterschrift = True  
          THEN 1
 ELSE 0 END) AS PpAz_1_A2,
 
 SUM(CASE WHEN lppru.id_fsklnr = 15
         AND lppru.bezeichnung IN ('Praxis','Prüfung')
             AND lppru.id_prstatus = 1
             AND lppru.isUnterschrift = True  
          THEN 1
 ELSE 0 END) AS PpAz_1_B,
   
 
 SUM(CASE WHEN lppru.id_fsklnr = 15
         AND lppru.bezeichnung IN ('WH Praxis','WH Prüfung')
     AND lppru.id_prstatus = 1
       AND lppru.isUnterschrift = True  
          THEN 1
 ELSE 0 END) AS PpAz_2_B,

       
/* Anfang Erste und Zweite Nicht Bestandene Prüfung*/

  SUM(CASE WHEN lppru.id_fsklnr IN (50,13,51,53,15,16)
            AND lppru.bezeichnung IN ('Praxis','Prüfung','WH Praxis','WH Prüfung')
            AND lppru.id_prstatus = 2
    AND lppru.isUnterschrift = True
            THEN 1
   ELSE 0 END) AS PpAz_0
   


FROM davidw2000._mtbl_leist AS leist

   LEFT JOIN davidw2000._kde_leist AS lkde ON leist.id_flleist = lkde.id_flleist
   LEFT JOIN davidw2000._mtbl_leistsonstiges AS lsonst ON lsonst.id_flleist = leist.id_flleist
   LEFT JOIN davidw2000._kde_leistfahrstunden AS lfahrs  ON lkde.id_kdleist = lfahrs.id_kdleist
   LEFT JOIN  davidw2000._kde_leistpruefungpraxis AS lppru ON lppru.id_kdleist = lkde.id_kdleist
 
WHERE leist.id_nrmitar = 3
AND  leist.lsdate BETWEEN '2017-05-01 00:00:00' AND '2017-05-31 23:59:59'
GROUP BY
leist.lsdate
ORDER BY
leist.lsdate DESC) AS x

INNER JOIN davidw2000._mtbl_stammdaten AS Stamm ON x.id_nrmitar = Stamm.id_mitar
INNER JOIN davidw2000._sys_anrede      AS Anr   ON Stamm.id_anrnr = Anr.id_anrnr[sql]

[ATTACH=full]65234[/ATTACH]

Am 31.05.2017 wird unter Pa_2_B eine bestandene 2. WH Prüfung aufgeführt, was aber  nicht sein darf weil diese ist mehr als eine WH Prüf, diese sollte unter Pp_ohne Erfolg mit gezählt werden, füge auch die zwei wichtigen Tabellen auch ein

Tab1:  _kde_leist
[ATTACH=full]65235[/ATTACH]

Tab 2: _kde_LeistPruefungPraxis

[ATTACH=full]65236[/ATTACH]
```

In der ersten Abfrage bekomme ich die mehr als eine WH Prüfungen weg, wer eine WH hat wird und soll auch angezeigt werden, bekomme aber die mehr als eine WH Prüf nicht in die zweite rein, wo ist wieder der Wurm 


```
/* Mehr als eine Nicht bestandene ('WH Praxis','WH Prüfung') dürfen hier nicht angezeigt werden*/  
 SUM(CASE WHEN lppru.id_fsklnr = 15
         AND lppru.bezeichnung IN ('WH Praxis','WH Prüfung') 
     AND lppru.id_prstatus = 1
       AND lppru.isUnterschrift = True
    AND (
       SELECT Count(davidw2000._kde_leistpruefungpraxis.bezeichnung)
                       FROM davidw2000._kde_leistpruefungpraxis
                 INNER JOIN davidw2000._kde_leist ON davidw2000._kde_leist.id_kdleist = davidw2000._kde_leistpruefungpraxis.id_kdleist
                      WHERE davidw2000._kde_leistpruefungpraxis.id_prstatus = 1
                        AND davidw2000._kde_leistpruefungpraxis.bezeichnung IN ('WH Praxis','WH Prüfung')) < 2   
            THEN 1
 ELSE 0 END) AS PpAz_2_B,

         
/* Anfang nicht bestandene ('Praxis','Prüfung') , Nicht bestandene ('WH Praxis','WH Prüfung'),  Mehr als eine Nicht bestandene ('WH Praxis','WH Prüfung')*/

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


----------



## Biber3 (26. August 2017)

Moin Technic1965,

Da sollte doch reichen...


```
..   CASE WHEN x.PpAz_2_B >= 1THEN 1 ELSE '-' END AS Pa_2_B,
CASE WHEN ...
```

Statt 1 kannst du ja auch ein Kreuzchen 'x' hinmalen.

Grüße 
Biber


----------



## Technic1965 (26. August 2017)

Biber3 hat gesagt.:


> .. *CASE* *WHEN* x.PpAz_2_B >= 1THEN 1 *ELSE* '-' *END* *AS* Pa_2_B,
> 
> *CASE* *WHEN* ...


Geht leider nicht, kann ich denn nicht die Anzahl ('WH Prüfung','WH Praxis') zählen und wer mehr als eine WH gefahren ist soll nicht unter Pa_2_B, die möchte ich aber unter Pp_ohne_erfolg anzeigen

```
( SELECT Count(davidw2000._kde_leistpruefungpraxis.bezeichnung)
FROM davidw2000._kde_leistpruefungpraxis
INNER JOIN davidw2000._kde_leist [B]ON[/B] davidw2000._kde_leist.id_kdleist = davidw2000._kde_leistpruefungpraxis.id_kdleist
WHERE davidw2000._kde_leistpruefungpraxis.bezeichnung IN ('WH Prüfung','WH Praxis')
AND davidw2000._kde_leistpruefungpraxis.id_nrmitar = x.id_nrmitar
AND davidw2000._kde_leist.id_kdleist = davidw2000._kde_leistpruefungpraxis.id_kdleist
AND davidw2000._kde_leist.id_kd = 1331) AS Anzahl_WH_Prüf_oder_WH_Prax,
[sql]
aber ich kann ja schlecht kd nummer manuel eingeben, dieser hatte 4 WH(mehr als eine WH 01.08.2017,  4. und fertig), wird leider unter Pa_2_B aufgeführt, soll aber nicht, sondern unter Pp_ohne_erfolg

[ATTACH=full]65237[/ATTACH][ATTACH=full]65237[/ATTACH] [ATTACH=full]65237[/ATTACH]
```

Ich versuche es mal anders zu erklären, also das was du zuletzt beschrieben hast geht leider nicht, bevor aufgelistet wird sollte nach geprüft werden wieviele WH Prüfungen der Kunde gefahren ist, bestandene erste WH Prüfung anzahl sollte gezählt werden, mehr als eine WH Prüf anzahl wird unter Prüf ohne erfolg gezählt werden also hier fehlt was 


```
SUM(CASE WHEN lppru.id_fsklnr = 15
         AND lppru.bezeichnung IN ('WH Praxis','WH Prüfung')
     AND lppru.id_prstatus = 1
       AND lppru.isUnterschrift = True   
            THEN 1
 ELSE 0 END) AS PpAz_2_B,[SQL]
```


----------



## Biber3 (26. August 2017)

Moin Technic1965,

ist mir nicht ganz klar.
Diese mehrfachen Wh-Prüfungen
- haben doch wohl nicht den id_prstatus=1, von dem ich annahm, er bedeutet 'bestanden'?
- gezählt werden sollen die Wh-Prüfungen als mehrfach nur, wenn sie auch beim selben Fahrlehrer waren? Und die nicht bestandenen Wh-Prüfungen können irgendwann gewesen sein, d.h. der Zeitraum ist irrelevant?

Ich war bisher davon ausgegangen, wir zählen ohnehin nur die bestandenen Prüfungen je Tag... haben wir gar kein Kriterium für bestanden/nicht bestanden?

Grüße
Biber


----------



## Technic1965 (26. August 2017)

Richtig, nur die WH s müssen gezählt werden , die können irgendwann gewesen sein, Fahrlehrer und Zeitraum unwichtig, hat der Kunde mehr als eine WH soll als erfolglose Prüf gelistet werden, weil wenn Kunde 10. WH besteht wird er dann auch als bestandene WH angezeigt, das wäre falsch, deswegen soll nur WH Prüfungen auf Anzahl der abgelegten WH s geprüft werden, hatte auch die 2 Tabellenbilder gepostet



Biber3 hat gesagt.:


> Moin Technic1965,
> 
> ist mir nicht ganz klar.
> Diese mehrfachen Wh-Prüfungen
> ...


Wollte ergänzen das nicht alle WH Prüfungen den den  prstatus= 1 haben, nur wenn irgendwann WH bestanden ist, sonst immer 2 als Erfolglose WH

Außerdem ist der prstatus bei WH Prüfungen unwichtig 1 oder 2 , alle WHs des Kunden wird gezählt und sind es mehr als 1 WH gilt diese als erfolglos, das wird am Tag der Bestandenen WH also dann prstatus 1 geprüft, hat er mehr als eine WH dann als erfolglos auslisten, ist eine WH mit prstatus 1 dann unter 2. bestandene Prüfung.


----------



## Biber3 (26. August 2017)

Na ja,

Dann ist tatsächlich die richtige Stelle zum Ändern das innere Select, Erweiterung der CASE WHEN-Bedingung so ähnlich wie in deinem Kommentar von 14:43h heute.

Also in etwa noch als Zusatz :
AND (SELECT COUNT (*)
FROM ...leistpruefungpraxis As lpp
INNER JOIN ...kde_leist kdl ON ....
WHERE lpp.Bezeichnung IN (...)
AND kdl.id_kd=lkde.id_kd) = 1

Mit anderen Worten: nur die Bezeichnung 'WH xy' und die id_kd des aktuellen lkde - Datensatzes sind die Kriterien.

Grüße
Biber


----------



## Technic1965 (27. August 2017)

Hi Biber, dieser verhindert mehr als eine WH, ich muss diesen jetzt ändern so das ich diesmal die mehr als eine WH bekomme 

```
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]
```



Biber3 hat gesagt.:


> 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


```
/* 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. 


```
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]
```


----------



## Biber3 (27. August 2017)

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


----------



## Technic1965 (28. August 2017)

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


```
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]
```


----------



## Biber3 (28. August 2017)

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


----------



## Technic1965 (28. August 2017)

Biber3 hat gesagt.:


> 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.



Biber3 hat gesagt.:


> 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


```
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.


----------



## Biber3 (29. August 2017)

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:

```
...
, 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...

```
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


----------



## Technic1965 (29. August 2017)

Biber3 hat gesagt.:


> ...
> 
> , *SUM*(*CASE* *WHEN*   lppru.bezeichnung *IN* ('WH Praxis','WH Prüfung','Praxis','Prüfung')
> 
> ...


Perfekt, komentar folgt 



Biber3 hat gesagt.:


> *SUM*(*CASE* *WHEN*   lppru.bezeichnung *IN* ('WH Praxis','WH Prüfung','Praxis','Prüfung')
> 
> *AND* lppru.id_prstatus = 2
> 
> ...


diese listet alle Prüfungen mit Status 2 


Biber3 hat gesagt.:


> *SUM*(*CASE* *WHEN* lppru.bezeichnung *IN* ('WH Praxis','WH Prüfung') _/* Wiederholprüfung */_
> 
> *AND* lppru.id_prstatus = 1 _/* bestanden... */_
> 
> ...



diese hier bringt mir alle bestandenen WHs mit prstatus=1, die mehr als eine WH hat, problemlos


----------



## Biber3 (30. August 2017)

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


----------



## Technic1965 (31. August 2017)

Biber3 hat gesagt.:


> 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,



Biber3 hat gesagt.:


> 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)



Biber3 hat gesagt.:


> 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.





Biber3 hat gesagt.:


> 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



Biber3 hat gesagt.:


> 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:
> ...


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 

```
(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]
```


----------



## Biber3 (31. August 2017)

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


----------



## Technic1965 (7. September 2017)

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

```
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]
```


----------



## Biber3 (7. September 2017)

Moin Technic1965,

hm, vielleicht hast du es überlesen, aber ich hatte vor ein paar Tagen genau zu diesem offenen Punkt ein paar Rückfragen gestellt.

Inzwischen habe ich eine Rückfrage selbst beantworten können: Dein Plan scheint ja zu sein, in jeder einzelnen Zeile der Auswertung jeweils in den Spalten "Vergütung A", "Vergütung B" etc  einen (immer den gleichen) Wert zu schreiben, also den Wert "Vergütung Mopedfahrstunde" = 17 Euro an jedem Tag zu schreiben, egal, ob an diesen Tag eine Mopedstunde erteilt wurde oder nicht.

Für mich sind dann diese Daten ("Vergütung je xy-Stunde") nur und ausschliesslich von MitarbeiterID, der dafür hinterlegten Fahrlehrervergütung für eine bestimmte Fahrzeugklasse abhängig -also eigentlich Informationen aus drei Tabellen. Du holst aber tendentiell eher aus 7 Tabellen... wobei ich mich als Laie schon frage, wieso denn bei Fahrlehrervergütung eine Rolle spielen kann, ob dafür ein  Fahrzeug existiert, welches den Status=1 hat... What? Wieso kann die Vergütung irgendeiner (evtl. nicht mal erteilten ) Mopedstunde davon abhängen, ob dafür ein Moped mit Status=1 existiert (Egal, was Status=1 bedeutet ..Rot? Blau? Angemeldet? Verschrottet? Geklaut?)

Egal, ich würde 
a) fachlich klären, wovon denn nun diese Fahrlehrer-Prüfung abhängt.
b) das werden natürlich schon mehrere JOINs sein (aber bestimmt nicht 7!). Für diese Joins würde ich  ein Select machen über alle Mitarbeiter und alle FeK.Klassen, das wieder pivotieren, so dass in diesem Select EINE Zeile je id_mitar vorliegt mit einer Spalte Verg_A, eine Spalte Verg_B usw.

Und diesen Select an der Stelle zusätzlich verjoinen, wo du heute schon die Tabelle "Stammdaten" verjoinst.

Mach doch bitte mal (als eigenständiges SQL) den von dir gezeigten JOIN


```
SELECT *
                  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
```

... nimm meinetwegen noch diese Tabelle "Leistungsarten" mit rein als INNER JOIN
aber alles noch nicht mit GROUP BY behandelt
-> Und dann schau dir das Resultset mal (Tipp: ggf in Excel o.ä.).

Dieses Resultset wollen wir zusammendampfen auf eine Zeile je MA und ein paar Spalten mit der Vergütung.

So würde ich vorgehen: dieses jetzige Ermitteln von Werten mit Inline-Selects, die jeweils über eine DIN-A4-Seite gehen, das ist auf jeden Fall nicht geschickt.

Grüße
Biber


----------



## Technic1965 (7. September 2017)

Biber3 hat gesagt.:


> - auch (falls es eine Praxis-Leistung ist) die "id_fsklnr"


Führerscheinklassenummer z.B 15 = Klasse B (Auto FE)



Biber3 hat gesagt.:


> 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.


Richtig, Stundenlöhne (je 45 min) sind in der DB schon eingegeben



Biber3 hat gesagt.:


> wobei ich mich als Laie schon frage, wieso denn bei Fahrlehrervergütung eine Rolle spielen kann, ob dafür ein Fahrzeug existiert, welches den Status=1 hat... What? Wieso kann die Vergütung irgendeiner (evtl. nicht mal erteilten ) Mopedstunde davon abhängen, ob dafür ein Moped mit Status=1 existiert (Egal, was Status=1 bedeutet ..Rot? Blau? Angemeldet? Verschrottet? Geklaut?)


Löhne können auch bei Unterschiedlichen Fahrzeugen (Manuel oder Automatik) anders Vergüten, oder Leistungsart (Nachtfahrt, könnte man anders entlohnen als Fahrten die Tagsüber gefahren werden), bei der Eingabe in die DB wurde das berücksichtigt, also habe ich vor auch davon zu profitieren, Fahrzeuge oder Leistung unterschiedlich zu entlohnen.



Biber3 hat gesagt.:


> ob dafür ein Moped mit Status=1 existiert (Egal, was Status=1 bedeutet ..Rot? Blau? Angemeldet? Verschrottet? Geklaut?)


Status ist hier in diesen Fall ob das Fahrzeug noch existiert, Fahrzeug aktuell Status 1


----------



## Biber3 (7. September 2017)

Moin Technic1965,

also, es gibt kompetente Helfer hier im Forum, die bereitwillig mit großem handwerklichen Geschick Anforderungen umsetzen, egal wie abstrus dieser Plan des Beitragserstellers auch sein mag.
Jüngere Beispiele dafür sind Beiträge wie https://www.tutorials.de/threads/sql-abfrage-nach-5-gleichen-werten-in-spalte.405717/ oder https://www.tutorials.de/threads/da...2-kopieren-achten-auf-mitgliedsnummer.405604/.

Jedenfalls entspricht es eher meiner Mentalität, es dann handwerklich zu unterstützen, wenn am Ende des Tages auch das fertige Artefakt - also in diesem Fall das Statement - irgendwie funktionieren kann.
Also irgendwie mit den auf diesem Planeten geltenden und von den meisten Bewohnern auch anerkannten Naturgesetzen in Einklang zu bringen sind.

Die zwei Sollbruchbruchstellen, die ich in deinem Plan sehe (wo es NICHT in der realen Welt und deinen Daten funktionieren kann):

1) du wirst immer Auswertungen machen bezogen auf die Vergangenheit. Also heute im September für den August oder Juli, vielleicht auch irgendwann noch mal eine Auswertung für den Fahrlehrer #5 für den Dezember 2016 oder eine Jahresauswertung für das letzte Jahr.
Das waren Stunden/Stundensätze/Leistungen, die DAMALS wahr und richtig waren, zum damaligen Zeitpunkt.
Wenn du die Auswertung für Fahrlehrer #5/Dez.2016 machst, dann muss diese Auswertung erzeugt im Januar 2017 exakt identisch sein mit einer, die du im April 2017 machst und einer, die du im September 2017 machst.
ABER: Das Fahrschulauto, das im Dezember 2016 benutzt wurde, ist leider neulich -eventuell am Vatertag - in die Wupper gelenkt wurden und hat seitdem den "Status ungleich 1".
-> also unterschiedliche Ergebnisse bei Auswertungen der Vergangenheit, weil damals vorhandenes Fahrzeug nicht mehr existiert.

Variante des Problems: Der Fahrlehrer #5 hatte "damals" im Dezember 2016 einen Stundensatz von 17 Ocken, seit diesem kleinen Missgeschick mit dem Fahrzeug-in-die-Wupper-Lenken ist sein Stundensatz 15 Euro.

Was  bekommst du als Stundensatz angezeigt, wenn du die Auswertung für Dezember 2016 machst?
-> unterschiedliche Ergebnisse bei Auswertungen der Vergangenheit, weil sich der Stundensatz des Fahrlehrers geändert hat .

2) Das andere Problem:
Du gehst doch in deiner Auswertung davon aus, dass für jeden Fahrlehrer und jeden Tag ein gleicher Stundensatz je "Klasse" vorliegt .
Wenn du jetzt schreibst:
[Zitat}
Löhne können auch bei Unterschiedlichen Fahrzeugen (Manuel oder Automatik) anders Vergüten, oder Leistungsart (Nachtfahrt, könnte man anders entlohnen als Fahrten die Tagsüber gefahren werden), bei der Eingabe in die DB wurde das berücksichtigt, also habe ich vor auch davon zu profitieren, Fahrzeuge oder Leistung unterschiedlich zu entlohnen.
[/Zitat]

... dann ist das mit deinen zuletzt geposteten Statements nicht abgebildet.
Da ist nur EIN Wert je Kombination Fahrlehrer (id_mitar)  und Klasse und dadurch Fahrlehrervergütung) möglich.

Das war das, was ich ein paar Kommentare früher ausgeführt habe - es gibt (noch) keinen Bezug zur tatsächlich erbrachten Leistung (z.B. Nachtfahrt mit FzgID 22=Automatik-PKW am 17.Dezember)
Hier würde das Holen der Infos tatsächlich bei nur einer Fahrt an diesem Tag funktioieren.
Weil-> über die Leistung und die FzgID würde ich auch auf die richtige "Klasse" kommen und von da wieder auf die Fahrlehrervergütung.

Aber: was soll passieren, wenn der Fahrlehrer an diesem einen Tag drei Fahrstunden gab:
- eine KlasseX- Fahrt am 17.12. 14:00h mit Automatic-Fzg --> Stundensatz 15 Ocken
- eine KlasseX- Fahrt am 17.12. 16:00h mit Schaltgetriebe-Fzg --> Stundensatz 14 Ocken
- eine KlasseX- Fahrt am 17.12. 18:00h mit Automatic-Fzg/Nachtfahrt --> Stundensatz 17 Ocken

Was soll am 17.12. für ein Stundensatz im Feld "KlasseX" stehen???

Grüße
Biber
P.S. Ich will dich nicht nerven, ich will wirklich konstruktiv helfen.
Aber er bringt IMHO nichts, diese Problematiken nicht anzusprechen.
Oder zumindest Unklarheiten auszuräumen.

Grüße
Biber


----------



## Technic1965 (7. September 2017)

Biber3 hat gesagt.:


> P.S. Ich will dich nicht nerven, ich will wirklich konstruktiv helfen.


Also nerven tust du nicht, du hilfst und ich bin dafür dankbar, manchmal stellst du fragen die mir garnicht eingefallen sind, ich bin vollkommen zufrieden mit der Hilfe in diesem Form, DANKE 



Biber3 hat gesagt.:


> 1) du wirst immer Auswertungen machen bezogen auf die Vergangenheit. Also heute im September für den August oder Juli, vielleicht auch irgendwann noch mal eine Auswertung für den Fahrlehrer #5 für den Dezember 2016 oder eine Jahresauswertung für das letzte Jahr.


Richtig, daher ist es wohl richtig die Fahrzeuge id wegzulassen, wenn in FAhrzeug wegkommt bekomme ich keine Auswertung oder falsche Ergebnisse



Biber3 hat gesagt.:


> ... dann ist das mit deinen zuletzt geposteten Statements nicht abgebildet.
> Da ist nur EIN Wert je Kombination Fahrlehrer (id_mitar) und Klasse und dadurch Fahrlehrervergütung) möglich.


Möchte zurzeit die StundenLöhne nach Klasse in meiner Tabelle Anzeigen natürlich sollen die Stundenlöhne angezeigt die in dem Abgerufenen Zeitraum gültig sind.
wie in der Bruttotabelle








Biber3 hat gesagt.:


> Aber: was soll passieren, wenn der Fahrlehrer an diesem einen Tag drei Fahrstunden gab:
> - eine KlasseX- Fahrt am 17.12. 14:00h mit Automatic-Fzg --> Stundensatz 15 Ocken
> - eine KlasseX- Fahrt am 17.12. 16:00h mit Schaltgetriebe-Fzg --> Stundensatz 14 Ocken
> - eine KlasseX- Fahrt am 17.12. 18:00h mit Automatic-Fzg/Nachtfahrt --> Stundensatz 17 Ocken
> ...


Das wird nicht passieren, Automatik Schaltung war eine blöde Idee aber Nacht oder Tagesschulungen kann man ab einer bestimmten Zeit anders berechnen lassen da die Anfangszeit einer Unterrichteinheit Aufgelistet wird.

Meine Idee war die Stundensätze nach FE-Klasse werden in die DB eingegeben, die sollen nur aufgelistet werden, für welche Klasse welcher Stundenlohn(je 45min) gilt, für die Arbeitszeiten  in einem bestimmten Zeitraum (z.B ab 20:00 bis 08:00) wird zusätzlich je 45 min Bonus geben.
Mein letztes Statement war nur die Vereinbarten Std Löhne Auflisten.
Deine Vorstellung habe ich verstanden, die wäre zu kompliziert, dann hätte ich eine lange LIste, ich brauche nicht für jeden Tag die Std Löhne auszugeben, möchte diese am Ende mit den im Angegebenen Zeitraum geleisteten Minuten / 45 * StundenLohn.
Aber wie du schon beschrieben hast, eine A4 Seite pro Klasse Vergütung ist nicht schick, wenn ich die schon kürzen könnte wäre gut, Fahrzeuge lasse ich weg


----------



## Biber3 (7. September 2017)

Moin Technic1965,

also: die FzgID (oder id_fznr heisst die bei dir) wegzulassen... das ist auf keinen Fall der richtige Weg.
Ohne konkretes Fahrzeug sind ja nun Unterscheidungen nach Automatik/Schaltgetriebe oder anderen technischen Eigenschaften nicht möglich, und nach deinen Aussagen von vorher hängt u.U. davon der Stundensatz ab.

Die id_fznr brauchen wir; was wir NICHT brauchen für die Auswertung ist die Info, ob das Fahrzeug HEUTE am Tag der Ausführung des Statements noch auf dem Hof steht, in der Presse gelandet ist oder in Einzelteilen nach Somalia verschickt wurde.
Die Info "Fahrzeug.Status=1" ist vollkommen irrelevant für die Auswertung- mit diesem Fahrzeug WURDE eine Fahrstunde gegeben und dafür steht dem Fahrlehrer Vergütung zu und zwar soundsoviel Euro, weil das Fahrzeug zur KlasseX gehört.

Natürlich musst du in anderen Teilen deiner Datenerfassung diesen Status=1 berücksichtigen: bei der Planung der Fahrstunden für morgen oder die Zukunft. Denn da darfst du eben NICHT Fahrzeuge einplanen, die nicht mehr existieren, na klar.

Soweit zu dem Punkt id_fznr weglassen.

Dann noch mal danke für das Posten des letzten Bildchens mit "SELECT ... GROUP BY _sys_klasse.klasse"
Ist zwar jetzt schon mit Group by und nur für 1 Mitarbeiter, aber hilft ja schon.

Dazu die Frage: Hey, ist es Zufall oder Gesetzmäßigkeit, dass je Klasse/Mitarbeiter nur EIN Fahrzeug auftritt?
Genau da sehe ich ja eines der Probleme: Wenn für den Fahrlehrer #1 für die Klasse "PKW-Führerschein" ZWEI Fahrzeuge zugeordnet sind - eines mit Automatik und pr_preis=15,5 und eins mit Schaltknüppel und pr_preis=15,0

-> Was soll dann passieren? Oder ist das bei euch organisatorisch/per Dienstanweisung ausgeschlossen?

Oder haben doch innerhalb einer Klasse alle zugeordneten Fahrzeuge den gleichen Preis?
Das wäre aber ein Widerspruch zu deiner Aussage von vorhin mit der Preisnivellierung.

Na ja, wir knacken das schon noch, aber können ja auch erstmal noch eine Nacht drüber schlafen. 

Grüße
Biber

[Edit]
jetzt haben wir doch über Kreuz gepostet.
Einige meiner Fragen hast du jetzt schon beantwortet und das lese ich mir in Ruhe durch.
Aber zumindest ICH werde ein Feierabend-Bierchen geniessen und heute nix mehr mit Fahrschulautos machen. Don't drink and drive... kennst du ja bestimmt berufsbedingt.

Falls du auch eine Kölschstange zur Hand hast: Prost!
[/Edit}


----------



## Technic1965 (7. September 2017)

Biber3 hat gesagt.:


> Dazu die Frage: Hey, ist es Zufall oder Gesetzmäßigkeit, dass je Klasse/Mitarbeiter nur EIN Fahrzeug auftritt?


hier , das sind aktuelle fahrzeuge.*Status *1





Biber3 hat gesagt.:


> Oder haben doch innerhalb einer Klasse alle zugeordneten Fahrzeuge den gleichen Preis?


Ja richtig, wenn ich aber einen Ferrari oder Porsche einsetze denn kann man in die DB für das jeweilige Fahrzeug andere Preise eingeben, aber lassen wir mal weg.



Biber3 hat gesagt.:


> Falls du auch eine Kölschstange zur Hand hast: Prost!


gibt es etwas, was du nicht weißt? 

ich werde die Tage, nebenbei das Formular fertigmachen und die Ergebnisse einsetzen, dann kann man sich ein besseres Bild davon machen, aber möchte auch noch an den weiteren Abfragen weitermachen


----------



## Biber3 (8. September 2017)

Moin Technic1965,

okay, einer der nächsten Schritte könnte dann sein, aus der Abfrage, die bei dir Lohn.sql heisst tatsächlich eine Abfrage zu machen, die eine Zeile je Mitarbeiter und x Spalten für "Vergütung je Klasse bla liefert"

Aber da müssen wir und irgendwann entscheiden, ob die Information abhängt von
a) Ausgangspunkt: Mitarbeiterid-> Zuordung in Bruttolohnliste->Zuordnung in Fahrlehrervergütung->Zuordnung über Fs_Klnr zur Klassen
b) Ausgangspunkt (Mitarbeiternr+Leistung am konkreten Tag)->Fahrzeug->fskl_nr->Klassen->Fahrlehrervergütung->bruttolohnliste

Fall a) liefert eben die (pauschale) Info, wat der Fahrlehrer für einen Stundenlohn hat - datumsunabhängig, in jeder Zeile gleich, auch wenn es keine Fahrstunde an diesem Tag gab. 

Fall b) könnte dann zur genauen Berechnung der tatsächlichen Euro-beträge an einem bestimmten tag dienen, also bei drei Fahrstunden am Tag in KlasseX die Summe für diese 3 Fahrstunden liefern.

Da musst du halt entscheiden, was für diese Monatsübersicht sinnvoller ist

Grüße
Biber


----------



## Technic1965 (8. September 2017)

Biber3 hat gesagt.:


> Aber da müssen wir und irgendwann entscheiden, ob die Information abhängt von
> a) Ausgangspunkt: Abrechnungszeitraum und Mitarbeiterid (über Stammdaten "id_nrblist")-> Zuordung in Bruttolohnliste ("pldate" Vergütung gültig ab)->Zuordnung in Fahrlehrervergütung->Zuordnung über Fs_Klnr zur Klassen und über (Leistungsarten)"id_lsart"


Das ist die richtige Wahl, in der Bruttolohnliste gibt es eine Spalte "pldate" (Bruttolohn tab. Bild wurde gepostet) also wenn der Zeitraum der Abrechnung angegeben wird sollte auch der richtige Stundensatz erscheinen, wenn Abfragen vom letzten Jahr gemacht werden sollten auch der passende STD Lohn erscheinen


----------

