1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Hi nette Profis, kann ich diese Abfrage Optimieren

Dieses Thema im Forum "Relationale Datenbanksysteme" wurde erstellt von Technic1965, 4. August 2017.

  1. Technic1965

    Technic1965 Mitglied

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

    Code (SQL):
    1. (SUM((SELECT
    2. IfNull(SUM(davidw2000._mtbl_leistsonstiges.lsdauer), 0)
    3. FROM
    4. davidw2000._mtbl_leistsonstiges
    5. WHERE
    6. davidw2000._mtbl_leist.id_flleist = davidw2000._mtbl_leistsonstiges.id_flleist AND
    7. davidw2000._mtbl_leistsonstiges.id_lsart IN (38)))) AS Urlaub,
    8. (SUM((SELECT
    9. IfNull(SUM(davidw2000._mtbl_leistsonstiges.lsdauer), 0)
    10. FROM
    11. davidw2000._mtbl_leistsonstiges
    12. WHERE
    13. davidw2000._mtbl_leist.id_flleist = davidw2000._mtbl_leistsonstiges.id_flleist AND
    14. davidw2000._mtbl_leistsonstiges.id_lsart IN (40)))) AS Krank,
    15. (SUM((SELECT
    16. IfNull(SUM(davidw2000._mtbl_leistsonstiges.lsdauer), 0)
    17. FROM
    18. davidw2000._mtbl_leistsonstiges
    19. WHERE
    20. davidw2000._mtbl_leist.id_flleist = davidw2000._mtbl_leistsonstiges.id_flleist AND
    21. davidw2000._mtbl_leistsonstiges.id_lsart IN (42)))) AS Feiertag
     
  2. Biber3

    Biber3 Erfahrenes Mitglied

    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
    Code (SQL):
    1. SELECT
    2.   -- <Klartextfelder für Mitarbeiter + Tage laut Tabelle "Leistung">
    3.     <dein Ausschnitt oben>
    4. FROM <4 verknibbelte Tabellen>
    5. WHERE <mitarbeiternr= x und Zeitraum BETWEEN y und z>
    6. 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:
    Code (SQL):
    1. SELECT
    2.       leist.id_nrmitar
    3.     , leist.lsdate
    4.     , CASE WHEN (SUM (CASE WHEN lsonst.id_lsart = 38
    5.                            THEN lsonst.lsdauer
    6.                            ELSE 0 END   ) > 0
    7.            THEN 'U' ELSE '-' END AS Urlaub
    8.     , CASE WHEN (SUM (CASE WHEN lsonst.id_lsart = 40
    9.                            THEN lsonst.lsdauer
    10.                            ELSE 0 END ) > 0
    11.            THEN 'K' ELSE '-' END AS Krank
    12.     , CASE WHEN(SUM (CASE WHEN lsonst.id_lsart = 42
    13.                           THEN lsonst.lsdauer
    14.                           ELSE 0 END ) > 0
    15.            THEN 'F' ELSE '-' END AS Feiertag
    16. FROM davidw2000._mtbl_leist AS leist
    17.    LEFT JOIN davidw2000._mtbl_leistsonstiges AS lsonst ON leist.id_flleist = lsonst.id_flleist
    18.    -- weitere JOINs ...
    19.    -- WHERE ... <mitarbeiter=x und Zeitraum between y and z>
    20. GROUP BY
    21.   leist.id_nrmitar,
    22.   leist.lsdate
    23. ;
    24. ;
    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:
    Code (SQL):
    1. SELECT anr.Text           AS Anrede
    2.      , stamm.mavname     AS Vorname,
    3.      , stammdaten.maname AS Name,
    4.      -- , x.id_nrmitar /* interne ID, muss nicht angezeigt werden */
    5.      , x.lsdate
    6.      , CASE WHEN x.sumUrlaub   > 0 THEN 'U' ELSE '-' END AS Urlaub
    7.      , CASE WHEN x.sumKrank    > 0 THEN 'K' ELSE '-' END AS Krank
    8.      , CASE WHEN x.SumFeiertag > 0 THEN 'F' ELSE '-' END AS Feiertag
    9. FROM (
    10.     /* inneres SELECT: alle Summenwerte aus einem SELECT von Tabelle "leist" mit allen ihren Childs */
    11.      SELECT  leist.id_nrmitar
    12.            , leist.lsdate
    13.            , SUM (CASE WHEN lsonst.id_lsart = 38
    14.                        THEN lsonst.lsdauer
    15.                       ELSE 0 END   ) AS sumUrlaub
    16.             , SUM (CASE WHEN lsonst.id_lsart = 40
    17.                         THEN lsonst.lsdauer
    18.                         ELSE 0 END ) AS SumKrank
    19.             , SUM (CASE WHEN lsonst.id_lsart = 42
    20.                        THEN lsonst.lsdauer
    21.                        ELSE 0 END ) AS SumFeiertag
    22.         FROM davidw2000._mtbl_leist AS leist
    23.           -- weitere JOINs .. (hier nicht wesentlich)
    24.            -- LEFT JOIN davidw2000._kde_leist...
    25.            -- LEFT JOIN davidw2000._mtbl_leistunterricht
    26.            LEFT JOIN davidw2000._mtbl_leistsonstiges AS lsonst
    27.               ON leist.id_flleist = lsonst.id_flleist
    28.         WHERE leist.id_nrmitar = 5
    29.           AND leist.lsdate BETWEEN '2017-06-01 00:00:00' AND '2017-06-31 23:59:59'
    30.         GROUP BY
    31.           leist.id_nrmitar,
    32.           leist.lsdate
    33.         )  AS x
    34.  
    35.   INNER JOIN davidw2000._mtbl_stammdaten AS Stamm ON x.id_nrmitar = Stamm.id_mitar
    36.   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 und sheel gefällt das.
  3. Technic1965

    Technic1965 Mitglied

     
  4. Technic1965

    Technic1965 Mitglied

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

    Biber3 Erfahrenes Mitglied

    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.

    Code (SQL):
    1. SELECT anr.Text           AS Anrede
    2.      , stamm.mavname     AS Vorname
    3.      , stamm.maname AS Name
    4.      , <bla>....

    Grüße
    Biber
     
  6. Fragenfrager

    Fragenfrager Erfahrenes Mitglied

  7. Technic1965

    Technic1965 Mitglied

    HI Biber3

    mittlerweile sieht es so aus
    Code (SQL):
    1. SELECT Anr.Text AS Anrede,
    2. stamm.mavname AS Vorname,
    3. stamm.maname AS Name,
    4. Date_Format(x.lsdate, '%d.%m.%Y') AS Datum,
    5. Ifnull(x.sumTheorie ,0) AS Theorie,
    6. CASE WHEN x.sumFahrs_Mofa > 0 THEN Ifnull(x.sumFahrs_Mofa ,0) ELSE '-' END AS Fahrs_Mofa,
    7. CASE WHEN x.sumFahrs_AM > 0 THEN Ifnull(x.sumFahrs_AM ,0) ELSE '-' END AS Fahrs_AM,
    8. CASE WHEN x.sumFahrs_A1 > 0 THEN Ifnull(x.sumFahrs_A1 ,0) ELSE '-' END AS Fahrs_A1,
    9. CASE WHEN x.sumFahrs_AA2 > 0 THEN Ifnull(x.sumFahrs_AA2 ,0) ELSE '-' END AS Fahrs_AA2,
    10. CASE WHEN x.sumFahrs_B > 0 THEN Ifnull(x.sumFahrs_B ,0) ELSE '-' END AS Fahrs_B,
    11. CASE WHEN x.sumFahrs_BE > 0 THEN Ifnull(x.sumFahrs_BE ,0) ELSE '-' END AS Fahrs_BE,
    12.  
    13. CASE WHEN x.sumUrlaub > 0 THEN 'U' ELSE '-' END AS Urlaub,
    14. CASE WHEN x.sumKrank > 0 THEN 'K' ELSE '-' END AS Krank,
    15. CASE WHEN x.SumFeiertag > 0 THEN 'F' ELSE '-' END AS Feiertag
    16.  
    17. FROM (
    18.  
    19. [I]/* inneres SELECT: alle Summenwerte aus einem SELECT von Tabelle "leist" mit allen ihren Childs */
    20. [/I]
    21. SELECT leist.id_nrmitar, leist.lsdate,
    22. SUM(ltheo.dauer) AS sumTheorie,
    23.  
    24. SUM(CASE WHEN lfahrs.isUnterschrift = TRUE
    25. AND lfahrs.is_fsklnr IN ('27')
    26.  
    27. THEN lfahrs.lsdauer
    28. ELSE 0 END ) AS sumFahrs_Mofa,
    29.  
    30. SUM(CASE WHEN lfahrs.isUnterschrift = TRUE
    31. AND lfahrs.is_fsklnr IN ('50')
    32.  
    33. THEN lfahrs.lsdauer
    34. ELSE 0 END ) AS sumFahrs_AM,
    35.  
    36. SUM(CASE WHEN lfahrs.isUnterschrift = TRUE
    37. AND lfahrs.is_fsklnr IN ('13')
    38.  
    39. THEN lfahrs.lsdauer
    40. ELSE 0 END ) AS sumFahrs_A1,
    41.  
    42. SUM(CASE WHEN lfahrs.isUnterschrift = TRUE
    43. AND lfahrs.is_fsklnr IN ('51','53')
    44.  
    45. THEN lfahrs.lsdauer
    46. ELSE 0 END ) AS sumFahrs_AA2,
    47.  
    48. SUM(CASE WHEN lfahrs.isUnterschrift = TRUE
    49. AND lfahrs.is_fsklnr IN ('15')
    50.  
    51. THEN lfahrs.lsdauer
    52. ELSE 0 END ) AS sumFahrs_B,
    53.  
    54. SUM(CASE WHEN lfahrs.isUnterschrift = TRUE
    55. AND lfahrs.is_fsklnr IN ('52')
    56.  
    57. THEN lfahrs.lsdauer
    58. ELSE 0 END ) AS sumFahrs_BE,
    59.  
    60. SUM(CASE WHEN lsonst.id_lsart = 38
    61. THEN lsonst.lsdauer
    62. ELSE 0 END ) AS sumUrlaub,
    63.  
    64. SUM(CASE WHEN lsonst.id_lsart = 40
    65. THEN lsonst.lsdauer
    66. ELSE 0 END ) AS SumKrank,
    67.  
    68. SUM(CASE WHEN lsonst.id_lsart = 42
    69. THEN lsonst.lsdauer
    70. ELSE 0 END ) AS SumFeiertag
    71. FROM davidw2000._mtbl_leist AS leist
    72.  
    73. LEFT JOIN davidw2000._mtbl_leistsonstiges AS lsonst ON leist.id_flleist = lsonst.id_flleist
    74. LEFT JOIN davidw2000._mtbl_leistunterricht AS ltheo ON leist.id_flleist = ltheo.id_flleist
    75. LEFT JOIN davidw2000._kde_leist AS lkde ON leist.id_flleist = lkde.id_flleist
    76. LEFT JOIN davidw2000._kde_leistfahrstunden AS lfahrs ON lkde.id_kdleist = lfahrs.id_kdleist
    77. LEFT JOIN davidw2000._kde_leistpruefungpraxis AS lprapru ON lkde.id_kdleist = lprapru.id_kdleist
    78.  
    79. WHERE leist.id_nrmitar = 3
    80. AND leist.lsdate BETWEEN '2017-06-01 00:00:00' AND '2017-06-31 23:59:59'
    81. GROUP BY
    82.  
    83.  
    84. leist.id_nrmitar,
    85. leist.lsdate DESC) AS x
    86.  
    87. INNER JOIN davidw2000._mtbl_stammdaten AS Stamm ON x.id_nrmitar = Stamm.id_mitar
    88. 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
    Code (SQL):
    1. LEFT JOIN davidw2000._kde_leist AS lkde ON leist.id_flleist = lkde.id_flleist
    verbinde, bekomme ich hier
    Code (SQL):
    1. Ifnull(x.sumTheorie ,0) AS Theorie
    eine Menge von Unt. Minuten also holt sich noch von der Tabelle (davidw2000._kde_leist) Daten.
     
  8. Biber3

    Biber3 Erfahrenes Mitglied

    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
    Code (SQL):
    1.  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:
    Code (SQL):
    1. SUM(CASE WHEN lfahrs.isUnterschrift = TRUE
    2. 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
     
    Zuletzt bearbeitet: 9. August 2017
    Technic1965 gefällt das.
  9. Technic1965

    Technic1965 Mitglied

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

    Technic1965 Mitglied

    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
    upload_2017-8-9_22-30-43.png upload_2017-8-9_22-29-13.png upload_2017-8-9_22-30-43.png
    Code (SQL):
    1. SELECT Anr.Text AS Anrede,
    2. stamm.mavname AS Vorname,
    3. stamm.maname AS Name,
    4. Date_Format(x.lsdate, '%d.%m.%Y') AS Datum,
    5. x.sumTheorie AS Theorie,
    6. CASE WHEN x.sumFahrs_Mofa > 0 THEN x.sumFahrs_Mofa ELSE '-' END AS Fahrs_Mofa,
    7. CASE WHEN x.sumFahrs_AM > 0 THEN x.sumFahrs_AM ELSE '-' END AS Fahrs_AM,
    8. CASE WHEN x.sumFahrs_A1 > 0 THEN x.sumFahrs_A1 ELSE '-' END AS Fahrs_A1,
    9. CASE WHEN x.sumFahrs_A > 0 THEN x.sumFahrs_A ELSE '-' END AS Fahrs_A,
    10. CASE WHEN x.sumFahrs_A2 > 0 THEN x.sumFahrs_A2 ELSE '-' END AS Fahrs_A2,
    11. CASE WHEN x.sumFahrs_B > 0 THEN x.sumFahrs_B ELSE '-' END AS Fahrs_B,
    12. CASE WHEN x.sumFahrs_BE > 0 THEN x.sumFahrs_BE ELSE '-' END AS Fahrs_BE,
    13. CASE WHEN x.sumPraPru_AM > 0 THEN x.sumPraPru_AM ELSE '-' END AS Prax_AM,
    14. CASE WHEN x.sumPraPru_A1 > 0 THEN x.sumPraPru_A1 ELSE '-' END AS Prax_A1,
    15. CASE WHEN x.sumPraPru_A > 0 THEN x.sumPraPru_A ELSE '-' END AS Prax_A,
    16. CASE WHEN x.sumPraPru_A2 > 0 THEN x.sumPraPru_A2 ELSE '-' END AS Prax_A2,
    17. CASE WHEN x.sumPraPru_B > 0 THEN x.sumPraPru_B ELSE '-' END AS Prax_B,
    18. CASE WHEN x.sumPraPru_BE > 0 THEN x.sumPraPru_BE ELSE '-' END AS Prax_BE,
    19. CASE WHEN x.sumUrlaub > 0 THEN 'U' ELSE '-' END AS Urlaub,
    20. CASE WHEN x.sumKrank > 0 THEN 'K' ELSE '-' END AS Krank,
    21. CASE WHEN x.SumFeiertag > 0 THEN 'F' ELSE '-' END AS Feiertag
    22.  
    23. FROM (
    24.  
    25. SELECT leist.id_nrmitar,
    26. leist.lsdate,
    27. SUM(ltheo.dauer) AS sumTheorie,
    28.  
    29. SUM(CASE WHEN lfahrs.is_fsklnr = 27
    30. THEN lfahrs.lsdauer
    31. ELSE 0 END ) AS sumFahrs_Mofa,
    32.  
    33. SUM(CASE WHEN lfahrs.is_fsklnr = 50
    34. THEN lfahrs.lsdauer
    35. ELSE 0 END ) AS sumFahrs_AM,
    36.  
    37. SUM(CASE WHEN lfahrs.is_fsklnr = 13
    38. THEN lfahrs.lsdauer
    39. ELSE 0 END ) AS sumFahrs_A1,
    40.  
    41. SUM(CASE WHEN lfahrs.is_fsklnr = 51
    42. THEN lfahrs.lsdauer
    43. ELSE 0 END ) AS sumFahrs_A,
    44.  
    45. SUM(CASE WHEN lfahrs.is_fsklnr = 53
    46. THEN lfahrs.lsdauer
    47. ELSE 0 END ) AS sumFahrs_A2,
    48.  
    49. SUM(CASE WHEN lfahrs.is_fsklnr = 15
    50. THEN lfahrs.lsdauer
    51. ELSE 0 END ) AS sumFahrs_B,
    52.  
    53. SUM(CASE WHEN lfahrs.is_fsklnr = 52
    54. THEN lfahrs.lsdauer
    55. ELSE 0 END ) AS sumFahrs_BE,
    56.  
    57. SUM(CASE WHEN lprapru.id_fsklnr = 50
    58. THEN lprapru.lsdauer
    59. ELSE 0 END ) AS sumPraPru_AM,
    60.  
    61. SUM(CASE WHEN lprapru.id_fsklnr = 13
    62. THEN lprapru.lsdauer
    63. ELSE 0 END ) AS sumPraPru_A1,
    64.  
    65. SUM(CASE WHEN lprapru.id_fsklnr = 51
    66. THEN lprapru.lsdauer
    67. ELSE 0 END ) AS sumPraPru_A,
    68.  
    69. SUM(CASE WHEN lprapru.id_fsklnr = 53
    70. THEN lprapru.lsdauer
    71. ELSE 0 END ) AS sumPraPru_A2,
    72.  
    73. SUM(CASE WHEN lprapru.id_fsklnr = 15
    74. THEN lprapru.lsdauer
    75. ELSE 0 END ) AS sumPraPru_B,
    76.  
    77. SUM(CASE WHEN lprapru.id_fsklnr = 52
    78. THEN lprapru.lsdauer
    79. ELSE 0 END ) AS sumPraPru_BE,
    80.  
    81. SUM(CASE WHEN lsonst.id_lsart = 38
    82. THEN lsonst.lsdauer
    83. ELSE 0 END ) AS sumUrlaub,
    84. SUM(CASE WHEN lsonst.id_lsart = 40
    85. THEN lsonst.lsdauer
    86. ELSE 0 END ) AS SumKrank,
    87.  
    88. SUM(CASE WHEN lsonst.id_lsart = 42
    89. THEN lsonst.lsdauer
    90. ELSE 0 END ) AS SumFeiertag
    91.  
    92. FROM davidw2000._mtbl_leist AS leist
    93.  
    94. LEFT JOIN davidw2000._mtbl_leistsonstiges AS lsonst ON leist.id_flleist = lsonst.id_flleist
    95. LEFT JOIN davidw2000._mtbl_leistunterricht AS ltheo ON leist.id_flleist = ltheo.id_flleist
    96. LEFT JOIN davidw2000._kde_leist AS lkde ON leist.id_flleist = lkde.id_flleist
    97. LEFT JOIN davidw2000._kde_leistfahrstunden AS lfahrs ON lkde.id_kdleist = lfahrs.id_kdleist AND lfahrs.isUnterschrift = TRUE
    98. LEFT JOIN davidw2000._kde_leistpruefungpraxis AS lprapru ON lkde.id_kdleist = lprapru.id_kdleist AND lprapru.isUnterschrift = TRUE
    99.  
    100. WHERE leist.id_nrmitar = 1
    101. AND leist.lsdate BETWEEN '2017-06-01 00:00:00' AND '2017-06-30 23:59:59'
    102. GROUP BY
    103. leist.id_nrmitar,
    104. leist.lsdate
    105. ORDER BY leist.lsdate DESC) AS x
    106.  
    107. INNER JOIN davidw2000._mtbl_stammdaten AS Stamm ON x.id_nrmitar = Stamm.id_mitar
    108. INNER JOIN davidw2000._sys_anrede AS Anr ON Stamm.id_anrnr = Anr.id_anrnr[SQL]
    109.  
    110. 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
    111. [ATTACH=FULL]65214[/ATTACH]
    112.  
    113. [code=SQL]
    114. SELECT Anr.Text AS Anrede,
    115. stamm.mavname AS Vorname,
    116. stamm.maname AS Name,
    117. Date_Format(x.lsdate, '%d.%m.%Y') AS Datum,
    118. x.sumTheorie AS Theorie,
    119.  
    120. CASE WHEN x.sumUrlaub > 0 THEN 'U' ELSE '-' END AS Urlaub,
    121. CASE WHEN x.sumKrank > 0 THEN 'K' ELSE '-' END AS Krank,
    122. CASE WHEN x.SumFeiertag > 0 THEN 'F' ELSE '-' END AS Feiertag
    123.  
    124. FROM (
    125. SELECT leist.id_nrmitar,
    126. leist.lsdate,
    127.  
    128. SUM(ltheo.dauer) AS sumTheorie,
    129.  
    130. SUM(CASE WHEN lsonst.id_lsart = 38
    131. THEN lsonst.lsdauer
    132. ELSE 0 END ) AS sumUrlaub,
    133.  
    134. SUM(CASE WHEN lsonst.id_lsart = 40
    135. THEN lsonst.lsdauer
    136. ELSE 0 END ) AS SumKrank,
    137.  
    138. SUM(CASE WHEN lsonst.id_lsart = 42
    139. THEN lsonst.lsdauer
    140. ELSE 0 END ) AS SumFeiertag
    141. FROM davidw2000._mtbl_leist AS leist
    142. LEFT JOIN davidw2000._mtbl_leistsonstiges AS lsonst ON leist.id_flleist = lsonst.id_flleist
    143. LEFT JOIN davidw2000._mtbl_leistunterricht AS ltheo ON leist.id_flleist = ltheo.id_flleist
    144.  
    145. WHERE leist.id_nrmitar = 1
    146. AND leist.lsdate BETWEEN '2017-06-01 00:00:00' AND '2017-06-30 23:59:59'
    147. GROUP BY
    148. leist.id_nrmitar,
    149. leist.lsdate
    150. ORDER BY leist.lsdate DESC) AS x
    151.  
    152. INNER JOIN davidw2000._mtbl_stammdaten AS Stamm ON x.id_nrmitar = Stamm.id_mitar
    153. INNER JOIN davidw2000._sys_anrede AS Anr ON Stamm.id_anrnr = Anr.id_anrnr
    154. [SQL]
     
  11. Biber3

    Biber3 Erfahrenes Mitglied

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

    Technic1965 Mitglied

    Hi Biber,
    klappt bei mir nicht :) so sollte es aussehen
    upload_2017-8-11_1-22-59.png

    Aber Blödsinn kommt
    upload_2017-8-11_1-25-10.png

    Mache ich das, dann ist es richtig, dann bekomme ich aber keine Ergebnisse für die weiteren abfragen
    upload_2017-8-11_1-26-31.png

    Die Tabellen sehen so aus

    upload_2017-8-11_1-30-48.png upload_2017-8-11_1-22-59.png upload_2017-8-11_1-25-10.png upload_2017-8-11_1-26-31.png upload_2017-8-11_1-30-48.png
     
  13. Biber3

    Biber3 Erfahrenes Mitglied

    Moin Technic1965,

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

    Code (SQL):
    1. SELECT Anr.Text AS Anrede,
    2. stamm.mavname AS Vorname,
    3. stamm.maname AS Name,
    4. Date_Format(x.lsdate, '%d.%m.%Y') AS Datum,
    5. -- x.sumTheorie AS Theorie,
    6. ( SELECT SUM(ltheo.dauer)
    7.    FROM davidw2000._mtbl_leist AS l
    8.    INNER JOIN davidw2000._mtbl_leistunterricht AS ltheo ON l.id_flleist = ltheo.id_flleist
    9.    WHERE l.lsdate = x.lsdate
    10.    AND l.id_nrmitar .x.id_nrmitar
    11. ) AS Theorie
    12. , ...
    13. ..
    14. FROM (
    15.    <inneres Select> )
    16. AS x
    17. ...
    Den Rest erstmal so lassen.
    So sollten alle Theoriestunden für den Tag und den Mitarbeiter gefunden werden.

    Grüße
    Biber
     
    Technic1965 gefällt das.
  14. Technic1965

    Technic1965 Mitglied

    Mittlerweile sieht es so aus auch mit der Theorie klappt es jetzt
    Code (SQL):
    1. SELECT Date_Format(x.lsdate, '%d.%m.%Y') AS Datum,
    2. Anr.Text AS Anrede,
    3. stamm.mavname AS Vorname,
    4. stamm.maname AS Name,
    5. (SELECT Ifnull(SUM(ltheo.dauer),0)
    6. FROM davidw2000._mtbl_leist AS l
    7. INNER JOIN davidw2000._mtbl_leistunterricht AS ltheo ON l.id_flleist = ltheo.id_flleist
    8. WHERE l.lsdate = x.lsdate
    9. AND l.id_nrmitar = x.id_nrmitar)AS Theorie,
    10. CASE WHEN x.sumFahrs_Mofa > 0 THEN x.sumFahrs_Mofa ELSE '-' END AS Fahrs_Mofa,
    11. CASE WHEN x.sumFahrs_AM > 0 THEN x.sumFahrs_AM ELSE '-' END AS Fahrs_AM,
    12. CASE WHEN x.sumFahrs_A1 > 0 THEN x.sumFahrs_A1 ELSE '-' END AS Fahrs_A1,
    13. CASE WHEN x.sumFahrs_A > 0 THEN x.sumFahrs_A ELSE '-' END AS Fahrs_A,
    14. CASE WHEN x.sumFahrs_A2 > 0 THEN x.sumFahrs_A2 ELSE '-' END AS Fahrs_A2,
    15. CASE WHEN x.sumFahrs_B > 0 THEN x.sumFahrs_B ELSE '-' END AS Fahrs_B,
    16. CASE WHEN x.sumFahrs_BE > 0 THEN x.sumFahrs_BE ELSE '-' END AS Fahrs_BE,
    17. CASE WHEN x.sumPraPru_AM > 0 THEN x.sumPraPru_AM ELSE '-' END AS Prax_AM,
    18. CASE WHEN x.sumPraPru_A1 > 0 THEN x.sumPraPru_A1 ELSE '-' END AS Prax_A1,
    19. CASE WHEN x.sumPraPru_A > 0 THEN x.sumPraPru_A ELSE '-' END AS Prax_A,
    20. CASE WHEN x.sumPraPru_A2 > 0 THEN x.sumPraPru_A2 ELSE '-' END AS Prax_A2,
    21. CASE WHEN x.sumPraPru_B > 0 THEN x.sumPraPru_B ELSE '-' END AS Prax_B,
    22. CASE WHEN x.sumPraPru_BE > 0 THEN x.sumPraPru_BE ELSE '-' END AS Prax_BE,
    23. CASE WHEN x.sumFahrs_Versaeumt > 0 THEN x.sumFahrs_Versaeumt ELSE '-' END AS Fahrs_Versaeumt,
    24. CASE WHEN x.sumPraPruU_fehlt OR x.sumFahrsU_fehlt > 0 THEN ((x.sumPraPruU_fehlt)+(x.sumFahrsU_fehlt)) ELSE '-' END AS Uschrift_fehlt,
    25. CASE WHEN x.sumFahrs_TagG OR x.sumPraPru_TagG > 0 THEN ((x.sumFahrs_TagG)+(x.sumPraPru_TagG)) ELSE '-' END AS Tag_Gesammt,
    26. CASE WHEN x.sumUrlaub > 0 THEN 'U' ELSE '-' END AS Urlaub,
    27. CASE WHEN x.sumKrank > 0 THEN 'K' ELSE '-' END AS Krank,
    28. CASE WHEN x.SumFeiertag > 0 THEN 'F' ELSE '-' END AS Feiertag
    29.  
    30. FROM (
    31.  
    32. SELECT leist.id_nrmitar,
    33. leist.lsdate,
    34.  
    35. SUM(CASE WHEN lfahrs.is_fsklnr = 27
    36. THEN lfahrs.lsdauer
    37. ELSE 0 END ) AS sumFahrs_Mofa,
    38.  
    39. SUM(CASE WHEN lfahrs.is_fsklnr = 50
    40. THEN lfahrs.lsdauer
    41. ELSE 0 END ) AS sumFahrs_AM,
    42.  
    43. SUM(CASE WHEN lfahrs.is_fsklnr = 13
    44. THEN lfahrs.lsdauer
    45. ELSE 0 END ) AS sumFahrs_A1,
    46.  
    47. SUM(CASE WHEN lfahrs.is_fsklnr = 51
    48. THEN lfahrs.lsdauer
    49. ELSE 0 END ) AS sumFahrs_A,
    50.  
    51. SUM(CASE WHEN lfahrs.is_fsklnr = 53
    52. THEN lfahrs.lsdauer
    53. ELSE 0 END ) AS sumFahrs_A2,
    54.  
    55. SUM(CASE WHEN lfahrs.is_fsklnr = 15
    56. THEN lfahrs.lsdauer
    57. ELSE 0 END ) AS sumFahrs_B,
    58.  
    59. SUM(CASE WHEN lfahrs.is_fsklnr = 52
    60. THEN lfahrs.lsdauer
    61. ELSE 0 END ) AS sumFahrs_BE,
    62.  
    63. SUM(CASE WHEN lfahrs.is_fsklnr IN ('13','27','50','51','53','15','52')
    64. THEN lfahrs.lsdauer
    65. ELSE 0 END ) AS sumFahrs_TagG,
    66.  
    67. SUM(CASE WHEN lprapru.id_fsklnr = 50
    68. THEN lprapru.lsdauer
    69. ELSE 0 END ) AS sumPraPru_AM,
    70.  
    71. SUM(CASE WHEN lprapru.id_fsklnr = 13
    72. THEN lprapru.lsdauer
    73. ELSE 0 END ) AS sumPraPru_A1,
    74.  
    75. SUM(CASE WHEN lprapru.id_fsklnr = 51
    76. THEN lprapru.lsdauer
    77. ELSE 0 END ) AS sumPraPru_A,
    78.  
    79. SUM(CASE WHEN lprapru.id_fsklnr = 53
    80. THEN lprapru.lsdauer
    81. ELSE 0 END ) AS sumPraPru_A2,
    82.  
    83. SUM(CASE WHEN lprapru.id_fsklnr = 15
    84. THEN lprapru.lsdauer
    85. ELSE 0 END ) AS sumPraPru_B,
    86.  
    87. SUM(CASE WHEN lprapru.id_fsklnr = 52
    88. THEN lprapru.lsdauer
    89. ELSE 0 END ) AS sumPraPru_BE,
    90.  
    91. SUM(CASE WHEN lprapru.id_fsklnr IN ('13','27','50','51','53','15','52')
    92. THEN lprapru.lsdauer
    93. ELSE 0 END ) AS sumPraPru_TagG,
    94.  
    95. SUM(CASE WHEN lkde.id_lsart = 18 AND
    96. lfahrs.is_fsklnr IN ('13','27','50','51','53','15','52')
    97. THEN lfahrs.lsdauer
    98. ELSE 0 END ) AS sumFahrs_Versaeumt,
    99.  
    100. SUM(CASE WHEN lprapruUsF.id_fsklnr IN ('13','27','50','51','53','15','52')
    101. THEN lprapruUsF.lsdauer
    102. ELSE 0 END ) AS sumPraPruU_fehlt,
    103.  
    104. SUM(CASE WHEN lfahrsUsF.is_fsklnr IN ('13','27','50','51','53','15','52')
    105. THEN lfahrsUsF.lsdauer
    106. ELSE 0 END ) AS sumFahrsU_fehlt,
    107.  
    108. SUM(CASE WHEN lsonst.id_lsart = 38
    109. THEN lsonst.lsdauer
    110. ELSE 0 END ) AS sumUrlaub,
    111.  
    112. SUM(CASE WHEN lsonst.id_lsart = 40
    113. THEN lsonst.lsdauer
    114. ELSE 0 END ) AS SumKrank,
    115.  
    116. SUM(CASE WHEN lsonst.id_lsart = 42
    117. THEN lsonst.lsdauer
    118. ELSE 0 END ) AS SumFeiertag
    119.  
    120. FROM davidw2000._mtbl_leist AS leist
    121.  
    122.  
    123.  
    124. LEFT JOIN davidw2000._kde_leist AS lkde ON lkde.id_flleist = leist.id_flleist
    125. LEFT JOIN davidw2000._mtbl_leistsonstiges AS lsonst ON lsonst.id_flleist = leist.id_flleist
    126. LEFT JOIN davidw2000._kde_leistfahrstunden AS lfahrs ON lkde.id_kdleist = lfahrs.id_kdleist AND lfahrs.isUnterschrift = TRUE
    127. LEFT JOIN davidw2000._kde_leistpruefungpraxis AS lprapru ON lkde.id_kdleist = lprapru.id_kdleist AND lprapru.isUnterschrift = TRUE
    128. LEFT JOIN davidw2000._kde_leistfahrstunden AS lfahrsUsF ON lkde.id_kdleist = lfahrsUsF.id_kdleist AND lfahrsUsF.isUnterschrift = FALSE
    129. LEFT JOIN davidw2000._kde_leistpruefungpraxis AS lprapruUsF ON lkde.id_kdleist = lprapruUsF.id_kdleist AND lprapruUsF.isUnterschrift = FALSE
    130.  
    131. WHERE leist.id_nrmitar = 1
    132. AND leist.lsdate BETWEEN '2017-06-01 00:00:00' AND '2017-06-30 23:59:59'
    133. GROUP BY
    134. leist.lsdate
    135. ORDER BY
    136. leist.lsdate DESC) AS x
    137.  
    138. INNER JOIN davidw2000._mtbl_stammdaten AS Stamm ON x.id_nrmitar = Stamm.id_mitar
    139. INNER JOIN davidw2000._sys_anrede AS Anr ON Stamm.id_anrnr = Anr.id_anrnr
     
  15. Technic1965

    Technic1965 Mitglied

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

    Biber3 Erfahrenes Mitglied

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

    Technic1965 Mitglied

    Ok, danke dir, schönen Urlaub :)

    Technic
     
  18. Technic1965

    Technic1965 Mitglied

    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
    Code (SQL):
    1. CASE WHEN X.PpAz_1_AM = 0 THEN '-' ELSE x.PpAz_1_AM END AS Pa_1_AM,
    2. CASE WHEN x.PpAz_1_A1 = 0 THEN '-' ELSE x.PpAz_1_A1 END AS Pa_1_A1,
    3. CASE WHEN x.PpAz_1_A = 0 THEN '-' ELSE x.PpAz_1_A END AS Pa_1_A,
    4. CASE WHEN x.PpAz_1_A2 = 0 THEN '-' ELSE x.PpAz_1_A2 END AS Pa_1_A2,
    5. CASE WHEN x.PpAz_1_B = 0 THEN '-' ELSE x.PpAz_1_B END AS Pa_1_B,
    6. CASE WHEN x.PpAz_1_BE = 0 THEN '-' ELSE x.PpAz_1_BE END AS Pa_1_BE,
    7. CASE WHEN x.PpAz_2_AM = 0 THEN '-' ELSE x.PpAz_2_AM END AS Pa_2_AM,
    8. CASE WHEN x.PpAz_2_A1 = 0 THEN '-' ELSE x.PpAz_2_A1 END AS Pa_2_A1,
    9. CASE WHEN x.PpAz_2_A = 0 THEN '-' ELSE x.PpAz_2_A END AS Pa_2_A,
    10. CASE WHEN x.PpAz_2_A2 = 0 THEN '-' ELSE x.PpAz_2_A2 END AS Pa_2_A2,
    11. CASE WHEN x.PpAz_2_B = 0 THEN '-' ELSE x.PpAz_2_B END AS Pa_2_B,
    12. CASE WHEN x.PpAz_2_BE = 0 THEN '-' ELSE x.PpAz_2_BE END AS Pa_2_BE,
    13. CASE WHEN x.PpAz_0 = 0 THEN '-' ELSE y.PpAz_0 END AS Pp_ohne_erfolg
    14. FROM(
    15. /* Anfang Erste Bestandene Prüfung*/
    16.  
    17. SELECT
    18. (CASE WHEN klpp.id_fsklnr = 50 AND
    19. klp.bezeichnung IN ('Praxis','Prüfung') AND
    20. klp.id_prstatus = 1 AND
    21. klp.isUnterschrift = TRUE AND
    22. ml.lsdate = x.lsdate AND
    23. ml.id_nrmitar = x.id_nrmitar
    24. THEN COUNT(klpp.bezeichnung)
    25. ELSE 0 END)AS PpAz_1_AM,
    26. (CASE WHEN klpp.id_fsklnr = 13 AND
    27. klp.bezeichnung IN ('Praxis','Prüfung') AND
    28. klp.id_prstatus = 1 AND
    29. klp.isUnterschrift = TRUE AND
    30. ml.lsdate = x.lsdate AND
    31. ml.id_nrmitar = x.id_nrmitar
    32. THEN COUNT(klpp.bezeichnung)
    33. ELSE 0 END)AS PpAz_1_A1,
    34. (CASE WHEN klpp.id_fsklnr = 51 AND
    35. klp.bezeichnung IN ('Praxis','Prüfung') AND
    36. klp.id_prstatus = 1 AND
    37. klp.isUnterschrift = TRUE AND
    38. ml.lsdate = x.lsdate AND
    39. ml.id_nrmitar = x.id_nrmitar
    40. THEN COUNT(klpp.bezeichnung)
    41. ELSE 0 END) AS PpAz_1_A,
    42. (CASE WHEN klpp.id_fsklnr = 53 AND
    43. klp.bezeichnung IN ('Praxis','Prüfung') AND
    44. klp.id_prstatus = 1 AND
    45. klp.isUnterschrift = TRUE AND
    46. ml.lsdate = x.lsdate AND
    47. ml.id_nrmitar = x.id_nrmitar
    48. THEN COUNT(klpp.bezeichnung)
    49. ELSE 0 END) AS PpAz_1_A2,
    50. (CASE WHEN klpp.id_fsklnr = 15 AND
    51. klp.bezeichnung IN ('Praxis','Prüfung') AND
    52. klp.id_prstatus = 1 AND
    53. klp.isUnterschrift = TRUE AND
    54. ml.lsdate = x.lsdate AND
    55. ml.id_nrmitar = x.id_nrmitar
    56. THEN COUNT(klpp.bezeichnung)
    57. ELSE 0 END) AS PpAz_1_B,
    58. (CASE WHEN klpp.id_fsklnr = 16 AND
    59. klp.bezeichnung IN ('Praxis','Prüfung') AND
    60. klp.id_prstatus = 1 AND
    61. klp.isUnterschrift = TRUE AND
    62. ml.lsdate = x.lsdate AND
    63. ml.id_nrmitar = x.id_nrmitar
    64. THEN COUNT(klpp.bezeichnung)
    65. ELSE 0 END) AS PpAz_1_BE,
    66. /* Anfang Zweite Bestandene Prüfung*/
    67.  
    68. (CASE WHEN klpp.id_fsklnr = 50 AND
    69. klp.bezeichnung IN ('WH Praxis','WH Prüfung') AND
    70. klp.id_prstatus = 2 AND
    71. klp.isUnterschrift = TRUE AND
    72. ml.lsdate = x.lsdate AND
    73. ml.id_nrmitar = x.id_nrmitar
    74. THEN COUNT(klpp.bezeichnung)
    75. ELSE 0 END)AS PpAz_2_AM,
    76. (CASE WHEN klpp.id_fsklnr = 13 AND
    77. klp.bezeichnung IN ('WH Praxis','WH Prüfung') AND
    78. klp.id_prstatus = 2 AND
    79. klp.isUnterschrift = TRUE AND
    80. ml.lsdate = x.lsdate AND
    81. ml.id_nrmitar = x.id_nrmitar
    82. THEN COUNT(klpp.bezeichnung)
    83. ELSE 0 END)AS PpAz_2_A1,
    84. (CASE WHEN klpp.id_fsklnr = 51 AND
    85. klp.bezeichnung IN ('WH Praxis','WH Prüfung') AND
    86. klp.id_prstatus = 2 AND
    87. klp.isUnterschrift = TRUE AND
    88. ml.lsdate = x.lsdate AND
    89. ml.id_nrmitar = x.id_nrmitar
    90. THEN COUNT(klpp.bezeichnung)
    91. ELSE 0 END) AS PpAz_2_A,
    92. (CASE WHEN klpp.id_fsklnr = 53 AND
    93. klp.bezeichnung IN ('WH Praxis','WH Prüfung') AND
    94. klp.id_prstatus = 2 AND
    95. klp.isUnterschrift = TRUE AND
    96. ml.lsdate = x.lsdate AND
    97. ml.id_nrmitar = x.id_nrmitar
    98. THEN COUNT(klpp.bezeichnung)
    99. ELSE 0 END) AS PpAz_2_A2,
    100. (CASE WHEN klpp.id_fsklnr = 15 AND
    101. klp.bezeichnung IN ('WH Praxis','WH Prüfung') AND
    102. klp.id_prstatus = 2 AND
    103. klp.isUnterschrift = TRUE AND
    104. ml.lsdate = x.lsdate AND
    105. ml.id_nrmitar = x.id_nrmitar
    106. THEN COUNT(klpp.bezeichnung)
    107. ELSE 0 END) AS PpAz_2_B,
    108. (CASE WHEN klpp.id_fsklnr = 16 AND
    109. klp.bezeichnung IN ('WH Praxis','WH Prüfung') AND
    110. klp.id_prstatus = 2 AND
    111. klp.isUnterschrift = TRUE AND
    112. ml.lsdate = x.lsdate AND
    113. ml.id_nrmitar = x.id_nrmitar
    114. THEN COUNT(klpp.bezeichnung)
    115. ELSE 0 END) AS PpAz_2_BE,
    116. /* Anfang Erste und Zweite Nicht Bestandene Prüfung*/
    117.  
    118. (CASE WHEN klpp.id_fsklnr IN (50,13,51,53,15,16) AND
    119. klp.bezeichnung IN ('Praxis','Prüfung','WH Praxis','WH Prüfung') AND
    120. klp.id_prstatus = 2 AND
    121. klp.isUnterschrift = TRUE AND
    122. ml.lsdate = x.lsdate AND
    123. ml.id_nrmitar = x.id_nrmitar
    124. THEN COUNT(klpp.bezeichnung)
    125. ELSE 0 END) AS PpAz_0
    126. FROM davidw2000._mtbl_leist AS ml
    127. LEFT JOIN davidw2000._kde_leist AS kl ON ml.id_flleist = kl.id_flleist
    128. LEFT JOIN davidw2000._kde_leistpruefungpraxis AS klpp ON kl.id_kdleist = klpp.id_kdleist
    129. [SQL]
     
  19. Biber3

    Biber3 Erfahrenes Mitglied

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

    Technic1965 Mitglied

    Hi Biber, ich glaube das war Unsinn was ich zusammen gereimt habe, also das ist aktuell der funktionierende teil
    Code (SQL):
    1. SELECT Date_Format(x.lsdate, '%d.%m.%Y') AS Ldatum,
    2.        Anr.Text AS Anrede,
    3.        stamm.mavname AS Vorname,
    4.        stamm.maname AS Name,
    5.        
    6.                
    7.   CASE WHEN
    8.        (SELECT SUM(ltheo.dauer)
    9.         FROM davidw2000._mtbl_leist AS l
    10.         INNER JOIN davidw2000._mtbl_leistunterricht AS ltheo ON l.id_flleist = ltheo.id_flleist    
    11.         WHERE l.lsdate = x.lsdate
    12.         AND l.id_nrmitar = x.id_nrmitar) > 0
    13.   THEN
    14.      (SELECT Ifnull(SUM(ltheo.dauer),0)
    15.         FROM davidw2000._mtbl_leist AS l
    16.         INNER JOIN davidw2000._mtbl_leistunterricht AS ltheo ON l.id_flleist = ltheo.id_flleist
    17.         WHERE l.lsdate = x.lsdate
    18.         AND l.id_nrmitar = x.id_nrmitar)
    19.   ELSE '-'
    20.   END AS Theorie,
    21.  
    22.   CASE WHEN x.sumFahrs_Mofa = 0 THEN '-' ELSE x.sumFahrs_Mofa END AS Fahrs_Mofa,
    23.   CASE WHEN x.sumFahrs_AM = 0 THEN '-' ELSE x.sumFahrs_AM END AS Fahrs_AM,
    24.   CASE WHEN x.sumFahrs_A1 = 0 THEN '-' ELSE x.sumFahrs_A1 END AS Fahrs_A1,
    25.   CASE WHEN x.sumFahrs_A = 0 THEN '-' ELSE x.sumFahrs_A END AS Fahrs_A,
    26.   CASE WHEN x.sumFahrs_A2 = 0 THEN '-' ELSE x.sumFahrs_A2 END AS Fahrs_A2,  
    27.   CASE WHEN x.sumFahrs_B = 0 THEN '-' ELSE x.sumFahrs_B END AS Fahrs_B,
    28.   CASE WHEN x.sumFahrs_BE = 0 THEN '-' ELSE x.sumFahrs_BE END AS Fahrs_BE,
    29.   CASE WHEN x.sumFahrs_B96 = 0 THEN '-' ELSE x.sumFahrs_B96 END AS Fahrs_B96,
    30.  
    31.   CASE WHEN x.sumPPru_AM = 0 THEN '-' ELSE x.sumPPru_AM END AS Prax_AM,
    32.   CASE WHEN x.sumPPru_A1 = 0 THEN '-' ELSE x.sumPPru_A1 END AS Prax_A1,
    33.   CASE WHEN x.sumPPru_A = 0 THEN '-' ELSE x.sumPPru_A END AS Prax_A,
    34.   CASE WHEN x.sumPPru_A2 = 0 THEN '-' ELSE x.sumPPru_A2 END AS Prax_A2,  
    35.   CASE WHEN x.sumPPru_B = 0 THEN '-' ELSE x.sumPPru_B END AS Prax_B,
    36.   CASE WHEN x.sumPPru_BE = 0 THEN '-' ELSE x.sumPPru_BE END AS Prax_BE,
    37.   CASE WHEN x.sumFahrs_Versaeumt > 0 THEN x.sumFahrs_Versaeumt ELSE '-' END AS Fahrs_Versaeumt,
    38.   CASE WHEN x.sumPPruU_fehlt + x.sumFahrsU_fehlt > 0 THEN (x.sumPPruU_fehlt + x.sumFahrsU_fehlt) ELSE '-' END AS Uschrift_fehlt,  
    39.  
    40.   CASE WHEN
    41.      (SELECT Ifnull(SUM(ltheo.dauer),0)
    42.         FROM davidw2000._mtbl_leist AS l
    43.         INNER JOIN davidw2000._mtbl_leistunterricht AS ltheo ON l.id_flleist = ltheo.id_flleist
    44.         WHERE l.lsdate = x.lsdate
    45.         AND l.id_nrmitar = x.id_nrmitar)+(x.sumFahrs_TagG)+(x.sumPPru_TagG) = 0
    46.   THEN '-'
    47.   ELSE
    48.         (SELECT Ifnull(SUM(ltheo.dauer),0)
    49.         FROM davidw2000._mtbl_leist AS l
    50.         INNER JOIN davidw2000._mtbl_leistunterricht AS ltheo ON l.id_flleist = ltheo.id_flleist
    51.         WHERE l.lsdate = x.lsdate
    52.         AND l.id_nrmitar = x.id_nrmitar)+(x.sumFahrs_TagG)+(x.sumPPru_TagG)
    53.   END AS LTagG,
    54.  
    55.          
    56.   CASE WHEN x.sumBu > 0 THEN x.sumBu ELSE '-' END AS Buro,
    57.   CASE WHEN x.sumPa > 0 THEN x.sumPa ELSE '-' END AS Pause,
    58.   CASE WHEN x.sumSo > 0 THEN x.sumSo ELSE '-' END AS Sonstiges,      
    59.   CASE WHEN x.sumUr > 0 THEN 'U' ELSE '-' END AS Urlaub,
    60.   CASE WHEN x.sumKr > 0 THEN 'K' ELSE '-' END AS Krank,
    61.   CASE WHEN x.SumFe > 0 THEN 'F' ELSE '-' END AS Feiertag
    62.  
    63. FROM (
    64.  
    65. /* inneres SELECT: alle Summenwerte aus einem SELECT von Tabelle "leist" mit allen ihren Childs */
    66.  
    67. SELECT  leist.id_nrmitar,
    68.         leist.lsdate,
    69.          
    70. /*Fahrstundenleistungen*/
    71.  
    72.   SUM(CASE WHEN lfahrs.is_fsklnr = 27
    73.     THEN lfahrs.lsdauer
    74.   ELSE 0 END ) AS sumFahrs_Mofa,
    75.    
    76.   SUM(CASE WHEN lfahrs.is_fsklnr = 50
    77.     THEN lfahrs.lsdauer
    78.   ELSE 0 END ) AS sumFahrs_AM,
    79.    
    80.   SUM(CASE WHEN lfahrs.is_fsklnr = 13
    81.     THEN lfahrs.lsdauer
    82.   ELSE 0 END ) AS sumFahrs_A1,
    83.    
    84.   SUM(CASE WHEN lfahrs.is_fsklnr = 51
    85.     THEN lfahrs.lsdauer
    86.   ELSE 0 END ) AS sumFahrs_A,
    87.  
    88.   SUM(CASE WHEN lfahrs.is_fsklnr = 53
    89.     THEN lfahrs.lsdauer
    90.   ELSE 0 END ) AS sumFahrs_A2,
    91.    
    92.   SUM(CASE WHEN lfahrs.is_fsklnr = 15
    93.     THEN lfahrs.lsdauer
    94.   ELSE 0 END ) AS sumFahrs_B,
    95.  
    96.   SUM(CASE WHEN lfahrs.is_fsklnr = 16
    97.      THEN lfahrs.lsdauer
    98.    ELSE 0 END ) AS sumFahrs_BE,
    99.    
    100.   SUM(CASE WHEN lfahrs.is_fsklnr = 52
    101.      THEN lfahrs.lsdauer
    102.    ELSE 0 END ) AS sumFahrs_B96,
    103.    
    104.   SUM(CASE WHEN lfahrs.lsdauer > 0
    105.      THEN lfahrs.lsdauer
    106.    ELSE 0 END ) AS sumFahrs_TagG,  
    107.  
    108.  
    109. /*PraxisPrüfungsleistungen*/  
    110.   SUM(CASE WHEN lppru.id_fsklnr = 50
    111.     THEN lppru.lsdauer
    112.   ELSE 0 END ) AS sumPPru_AM,
    113.    
    114.   SUM(CASE WHEN lppru.id_fsklnr = 13
    115.     THEN lppru.lsdauer
    116.   ELSE 0 END ) AS sumPPru_A1,
    117.    
    118.   SUM(CASE WHEN lppru.id_fsklnr = 51
    119.     THEN lppru.lsdauer
    120.   ELSE 0 END ) AS sumPPru_A,
    121.  
    122.   SUM(CASE WHEN lppru.id_fsklnr = 53
    123.     THEN lppru.lsdauer
    124.   ELSE 0 END ) AS sumPPru_A2,
    125.    
    126.   SUM(CASE WHEN lppru.id_fsklnr = 15
    127.        THEN lppru.lsdauer
    128.   ELSE 0 END) AS sumPPru_B,
    129.    
    130.   SUM(CASE WHEN lppru.id_fsklnr = 16
    131.      THEN lppru.lsdauer
    132.    ELSE 0 END ) AS sumPPru_BE,
    133.    
    134.   SUM(CASE WHEN lppru.lsdauer > 0
    135.      THEN lppru.lsdauer
    136.    ELSE 0 END ) AS sumPPru_TagG,  
    137.    
    138.    
    139.   SUM(CASE WHEN lkde.id_lsart = 18
    140.        AND lfahrs.isUnterschrift = FALSE
    141.      THEN lfahrs.lsdauer
    142.    ELSE 0 END ) AS sumFahrs_Versaeumt,
    143.    
    144.   SUM(CASE WHEN lppru.isUnterschrift = FALSE
    145.    THEN lppru.lsdauer
    146.    ELSE 0 END ) AS sumPPruU_fehlt,
    147.    
    148.   SUM(CASE WHEN lfahrs.isUnterschrift = FALSE
    149.    THEN lfahrs.lsdauer
    150.    ELSE 0 END ) AS sumFahrsU_fehlt,
    151.        
    152.    
    153. /*Sonstigeleistungen*/      
    154.   SUM(CASE WHEN lsonst.id_lsart = 30
    155.        THEN lsonst.lsdauer
    156.        ELSE 0 END ) AS sumBu,
    157.        
    158.   SUM(CASE WHEN lsonst.id_lsart = 36
    159.        THEN lsonst.lsdauer
    160.        ELSE 0 END ) AS sumPa,
    161.        
    162.   SUM(CASE WHEN lsonst.id_lsart = 34
    163.        THEN lsonst.lsdauer
    164.        ELSE 0 END ) AS sumSo,
    165.    
    166.   SUM(CASE WHEN lsonst.id_lsart = 38
    167.        THEN lsonst.lsdauer
    168.        ELSE 0 END ) AS sumUr,
    169.  
    170.   SUM(CASE WHEN lsonst.id_lsart = 40
    171.        THEN lsonst.lsdauer
    172.        ELSE 0 END ) AS SumKr,
    173.    
    174.   SUM(CASE WHEN lsonst.id_lsart = 42
    175.        THEN lsonst.lsdauer
    176.        ELSE 0 END ) AS SumFe
    177.  
    178. FROM davidw2000._mtbl_leist AS leist
    179.  
    180. /*
    181. -- weitere JOINs .. (hier nicht wesentlich)
    182. -- LEFT JOIN davidw2000._kde_leist...
    183. -- LEFT JOIN davidw2000._mtbl_leistunterricht
    184. */
    185.  
    186.  
    187. LEFT JOIN davidw2000._kde_leist AS lkde ON lkde.id_flleist = leist.id_flleist
    188. LEFT JOIN davidw2000._mtbl_leistsonstiges AS lsonst ON lsonst.id_flleist = leist.id_flleist
    189. LEFT JOIN davidw2000._kde_leistfahrstunden AS lfahrs  ON lkde.id_kdleist = lfahrs.id_kdleist AND lfahrs.isUnterschrift = TRUE
    190. LEFT JOIN davidw2000._kde_leistpruefungpraxis AS lppru ON lkde.id_kdleist = lppru.id_kdleist AND lppru.isUnterschrift = TRUE
    191.  
    192.  
    193. WHERE leist.id_nrmitar = 3
    194. AND  leist.lsdate BETWEEN '2017-06-01 00:00:00' AND '2017-06-31 23:59:59'
    195. GROUP BY
    196. leist.lsdate
    197. ORDER BY
    198. leist.lsdate DESC) AS x
    199.  
    200.  
    201. INNER JOIN davidw2000._mtbl_stammdaten AS Stamm ON x.id_nrmitar = Stamm.id_mitar
    202. INNER JOIN davidw2000._sys_anrede      AS Anr   ON Stamm.id_anrnr = Anr.id_anrnr
     
    Zuletzt bearbeitet: 14. August 2017 um 23:12 Uhr
Die Seite wird geladen...