{"beispielaufgaben":[{"artefakt_id":"artefakt.quellcode","aufgabe":[{"text":"Ausgangssituation","typ":"ueberschrift"},{"text":"Die Deichrad GmbH betreibt in acht Küstenorten ein Fahrradverleihsystem mit Ausleihstationen. Sie sind Mitarbeiter der IT-Abteilung und werten die Nutzungsdaten der vergangenen Saison aus.","typ":"absatz"},{"text":"Für das Verleihsystem wurde folgende Datenbank entwickelt:","typ":"ueberschrift"},{"text":"Station: PK ST_ID; ST_Ort; ST_Bezeichnung\nFahrrad: PK FR_ID; FK ST_ID; FR_Typ\nKunde: PK KD_ID; KD_Nachname; KD_Vorname\nAusleihe: PK AL_ID; FK FR_ID; FK KD_ID; AL_Startzeit; AL_Rueckgabezeit; AL_Entgelt","typ":"absatz"},{"text":"Beziehungen: Station 1:n Fahrrad; Fahrrad 1:n Ausleihe; Kunde 1:n Ausleihe.","typ":"absatz"},{"text":"Jedes Fahrrad ist fest einer Ausleihstation zugeordnet.","typ":"absatz"},{"text":"Erstellen Sie eine SQL-Abfrage, die je Ausleihstation die Anzahl der Ausleihen, das gesamte Entgelt und das höchste Einzelentgelt des Jahres 2025 liefert. Ausgegeben werden nur Stationen mit mehr als 500 Ausleihen, absteigend sortiert nach dem Gesamtentgelt.","typ":"absatz"},{"text":"8 Punkte","typ":"punktzeile"},{"text":"Ergebnistabelle:\nST_ID | ST_Bezeichnung | AnzahlAusleihen | GesamtEntgelt | HoechstesEntgelt\n14 | Hafenpromenade | 1840 | 9264.50 | 27.80\n7 | Kurpark Nord | 1122 | 5310.00 | 24.60\n23 | Bahnhof West | 640 | 2988.25 | 19.40","typ":"absatz"}],"beispiel_id":"bsp-sql-aggregation-und-gruppierung-erstellen-quellcode-01","freigabeart":"maschinell","loesung":[{"text":"Erwartungshorizont (8 Punkte)","typ":"ueberschrift"},{"text":"Die Syntax anderer SQL-Versionen ist ebenfalls als richtig zu bewerten.","typ":"absatz"},{"text":"SELECT ST.ST_ID, ST.ST_Bezeichnung,\n       COUNT(*) AS AnzahlAusleihen,\n       SUM(AL.AL_Entgelt) AS GesamtEntgelt,\n       MAX(AL.AL_Entgelt) AS HoechstesEntgelt                        2P\nFROM Station AS ST\n     INNER JOIN Fahrrad AS FR ON FR.ST_ID = ST.ST_ID\n     INNER JOIN Ausleihe AS AL ON AL.FR_ID = FR.FR_ID                2P\nWHERE YEAR(AL.AL_Startzeit) = 2025                                   1P\nGROUP BY ST.ST_ID, ST.ST_Bezeichnung                                 1P\nHAVING COUNT(*) > 500                                                1P\nORDER BY GesamtEntgelt DESC;                                         1P\n                                                                   = 8P","typ":"code"},{"text":"Bewertungshinweise:","typ":"ueberschrift"},{"text":"Die Zuordnung der Ausleihen zur Station verlaeuft ueber die Tabelle Fahrrad; ein direkter Bezug zwischen Station und Ausleihe ist im Datenmodell nicht vorhanden. Wer die Zwischentabelle uebergeht, erhaelt fuer den FROM-Teil keine Punkte.","typ":"absatz"},{"text":"Fuer die Einschraenkung auf 2025 ist auch ein Datumsvergleich mit BETWEEN oder mit zwei Vergleichsoperatoren auf AL_Startzeit anzuerkennen.","typ":"absatz"},{"text":"COUNT(AL.AL_ID) ist gleichwertig zu COUNT(*). Werden Aliasse weggelassen, stimmen die Spaltenueberschriften der Ergebnistabelle nicht; dafuer ist ein Punkt aus der SELECT-Liste abzuziehen.","typ":"absatz"},{"text":"Die Einschraenkung auf mehr als 500 Ausleihen muss in HAVING stehen. Eine gleichlautende Bedingung in der WHERE-Klausel ist fachlich falsch und wird nicht bewertet.","typ":"absatz"},{"text":"Wird im ORDER BY statt des Alias erneut SUM(AL.AL_Entgelt) geschrieben, ist das gleichwertig. Fehlt DESC, entfaellt der Punkt fuer die Sortierung.","typ":"absatz"}],"operator_id":"operator.erstellen","pruefungszuordnung":{"berufe":["FIAE","FIDP"],"teil":"AP2"},"punkte":8,"punkterahmen":{"max":12,"min":2},"quellen":["ap1-2022-herbst-gesamt-a04-a-ab","ap1-2022-herbst-gesamt-a04-a-ac","ap1-2023-fruehjahr-gesamt-a04-d-da","ap1-2023-herbst-gesamt-a04-c-cb","ap1-2023-herbst-gesamt-a04-c-cc","ap2-fiae-2021-winter-ae2-a04-d","ap2-fiae-2022-sommer-ae2-a04-b-bc","ap2-fiae-2022-winter-ae2-a04-a","ap2-fiae-2023-sommer-ae2-a04-a","ap2-fiae-2023-sommer-ae2-a04-c","ap2-fiae-2024-sommer-ae2-a04-b","ap2-fiae-2024-sommer-ae2-a04-d","ap2-fiae-2025-sommer-ae2-a04-e","ap2-fiae-2025-sommer-ae2-a04-f","ap2-fiae-2025-winter-ae2-a04-b","ap2-fiae-2025-winter-ae2-a04-c","ap2-fiae-2025-winter-ae2-a04-e","ap2-fiae-2026-sommer-ae2-a04-b","ap2-fiae-2026-sommer-ae2-a04-c-ca","ap2-fidp-2021-winter-fdp2-a02-e","ap2-fidp-2023-sommer-fdp2-a03-b-bb","ap2-fidp-2023-sommer-fdp2-a03-b-bc","ap2-fidp-2024-sommer-fdp2-a03-d-da","ap2-fidp-2024-sommer-fdp2-a03-d-db","ap2-fidp-2025-winter-fdp2-a03-c","ap2-fidp-2025-winter-fdp2-a03-d","ap2-fidp-2026-sommer-fdp2-a04-b","ap2-fidp-2026-sommer-fdp2-a04-c"]},{"artefakt_id":"artefakt.quellcode","aufgabe":[{"text":"Ausgangssituation","typ":"ueberschrift"},{"text":"Die Nordwall Entsorgung AG betreibt für einen Landkreis mehrere Wertstoffhöfe. Sie sind Mitarbeiter der IT-Abteilung und sollen Abfragen zur Auswertung der Anlieferungen erstellen.","typ":"absatz"},{"text":"Dafür wurde folgende Datenbank entwickelt:","typ":"ueberschrift"},{"text":"Wertstoffhof: PK WH_ID; WH_Standort\nMaterialart: PK MA_ID; MA_Bezeichnung; MA_Entgelt_je_Tonne\nAnlieferung: PK AN_ID; FK WH_ID; FK MA_ID; AN_Datum; AN_Masse_kg","typ":"absatz"},{"text":"Beziehungen: Wertstoffhof 1:n Anlieferung; Materialart 1:n Anlieferung.","typ":"absatz"},{"text":"Für jede angenommene Fuhre wird ein Datensatz in Anlieferung gespeichert.","typ":"absatz"},{"text":"Erstellen Sie eine SQL-Abfrage, die je Materialart die Anzahl der Anlieferungen, die gesamte angenommene Masse und die durchschnittliche Masse einer Anlieferung des Jahres 2025 liefert. Sortiert wird absteigend nach der Gesamtmasse.","typ":"absatz"},{"text":"Hinweis: Auch Materialarten ohne Anlieferung erscheinen im Ergebnis. 8 Punkte","typ":"absatz"},{"text":"Ergebnistabelle:\nMA_Bezeichnung | AnzahlAnlieferungen | GesamtMasse | DurchschnittMasse\nBauschutt | 412 | 786400 | 1908.7\nGrünschnitt | 355 | 240600 | 677.7\nAltholz | 87 | 61050 | 701.7\nElektroschrott | 0 | NULL | NULL","typ":"absatz"}],"beispiel_id":"bsp-sql-aggregation-und-gruppierung-erstellen-quellcode-02","freigabeart":"maschinell","loesung":[{"text":"Erwartungshorizont (8 Punkte)","typ":"ueberschrift"},{"text":"Die Syntax anderer SQL-Versionen ist ebenfalls als richtig zu bewerten.","typ":"absatz"},{"text":"SELECT MA.MA_Bezeichnung,\nCOUNT(AN.AN_ID) AS AnzahlAnlieferungen,\nSUM(AN.AN_Masse_kg) AS GesamtMasse,\nAVG(AN.AN_Masse_kg) AS DurchschnittMasse                      2P\nFROM Materialart AS MA\nLEFT JOIN Anlieferung AS AN\nON AN.MA_ID = MA.MA_ID                                   2P\nAND YEAR(AN.AN_Datum) = 2025                              2P\nGROUP BY MA.MA_ID, MA.MA_Bezeichnung                                 1P\nORDER BY GesamtMasse DESC;                                           1P\n= 8P","typ":"absatz"},{"text":"Bewertungshinweise:","typ":"ueberschrift"},{"text":"Kern der Aufgabe ist der aeussere Verbund. Die Materialart steht links, damit auch Bezeichnungen ohne passende Anlieferung im Ergebnis erscheinen. Ein INNER JOIN laesst die Zeile Elektroschrott entfallen und erhaelt fuer den FROM-Teil keine Punkte. RIGHT JOIN mit vertauschter Tabellenreihenfolge ist gleichwertig.","typ":"absatz"},{"text":"Die Einschraenkung auf das Jahr 2025 gehoert in die ON-Klausel. Steht sie stattdessen in einer WHERE-Klausel, werden Materialarten ohne Anlieferung im Zieljahr herausgefiltert und der aeussere Verbund wirkt wie ein innerer; die zwei Punkte fuer die Jahresbedingung entfallen dann.","typ":"absatz"},{"text":"COUNT muss ein Feld der Tabelle Anlieferung zaehlen. COUNT(*) liefert fuer Materialarten ohne Anlieferung faelschlich den Wert 1 und ist hier falsch.","typ":"absatz"},{"text":"Fuer Materialarten ohne Anlieferung geben SUM und AVG NULL zurueck; das entspricht der vorgegebenen Ergebnistabelle und ist nicht zu bemaengeln. Eine Umwandlung in 0 ist nicht gefordert, aber auch nicht falsch.","typ":"absatz"},{"text":"Die Gruppierung ueber MA_Bezeichnung allein ist anzuerkennen, solange die Bezeichnungen eindeutig sind.","typ":"absatz"}],"operator_id":"operator.erstellen","pruefungszuordnung":{"berufe":["FIAE","FIDP"],"teil":"AP2"},"punkte":8,"punkterahmen":{"max":12,"min":2},"quellen":["ap1-2022-herbst-gesamt-a04-a-ab","ap1-2022-herbst-gesamt-a04-a-ac","ap1-2023-fruehjahr-gesamt-a04-d-da","ap1-2023-herbst-gesamt-a04-c-cb","ap1-2023-herbst-gesamt-a04-c-cc","ap2-fiae-2021-winter-ae2-a04-d","ap2-fiae-2022-sommer-ae2-a04-b-bc","ap2-fiae-2022-winter-ae2-a04-a","ap2-fiae-2023-sommer-ae2-a04-a","ap2-fiae-2023-sommer-ae2-a04-c","ap2-fiae-2024-sommer-ae2-a04-b","ap2-fiae-2024-sommer-ae2-a04-d","ap2-fiae-2025-sommer-ae2-a04-e","ap2-fiae-2025-sommer-ae2-a04-f","ap2-fiae-2025-winter-ae2-a04-b","ap2-fiae-2025-winter-ae2-a04-c","ap2-fiae-2025-winter-ae2-a04-e","ap2-fiae-2026-sommer-ae2-a04-b","ap2-fiae-2026-sommer-ae2-a04-c-ca","ap2-fidp-2021-winter-fdp2-a02-e","ap2-fidp-2023-sommer-fdp2-a03-b-bb","ap2-fidp-2023-sommer-fdp2-a03-b-bc","ap2-fidp-2024-sommer-fdp2-a03-d-da","ap2-fidp-2024-sommer-fdp2-a03-d-db","ap2-fidp-2025-winter-fdp2-a03-c","ap2-fidp-2025-winter-fdp2-a03-d","ap2-fidp-2026-sommer-fdp2-a04-b","ap2-fidp-2026-sommer-fdp2-a04-c"]},{"artefakt_id":"artefakt.quellcode","aufgabe":[{"text":"Ausgangssituation","typ":"ueberschrift"},{"text":"Das Kulturforum Steinbach veranstaltet Konzerte, Lesungen und Theaterabende in drei Sälen. Sie betreuen als Dienstleister die Datenbank des Kartenverkaufs und sollen Abfragen zur Auswertung erstellen.","typ":"absatz"},{"text":"Auszug des Datenmodells:","typ":"ueberschrift"},{"text":"Saal: PK SL_ID; SL_Name; SL_Sitzplaetze\nVeranstaltung: PK VA_ID; FK SL_ID; VA_Titel; VA_Beginn\nKarte: PK KA_ID; FK VA_ID; KA_Verkaufsdatum; KA_Preis","typ":"absatz"},{"text":"Beziehungen: Saal 1:n Veranstaltung; Veranstaltung 1:n Karte.","typ":"absatz"},{"text":"In Karte steht je verkaufter Eintrittskarte genau ein Datensatz. Stornierte Karten werden aus der Tabelle entfernt.","typ":"absatz"},{"text":"Erstellen Sie eine SQL-Abfrage, die für jeden Saal die Anzahl der Veranstaltungen, die Zahl der verkauften Karten und den durchschnittlichen Kartenpreis des Jahres 2026 liefert. Berücksichtigt werden nur Säle mit mindestens zwölf Veranstaltungen, aufsteigend sortiert nach dem Saalnamen.","typ":"absatz"},{"text":"8 Punkte","typ":"punktzeile"},{"text":"Ergebnistabelle:\nSL_Name | AnzahlVeranstaltungen | VerkaufteKarten | MittlererPreis\nFoyerbühne | 38 | 2470 | 14.90\nGroßer Saal | 26 | 11840 | 32.45\nStudio Nord | 12 | 1104 | 18.20","typ":"absatz"}],"beispiel_id":"bsp-sql-aggregation-und-gruppierung-erstellen-quellcode-03","freigabeart":"maschinell","loesung":[{"text":"Erwartungshorizont (8 Punkte)","typ":"ueberschrift"},{"text":"Die Syntax anderer SQL-Versionen ist ebenfalls als richtig zu bewerten.","typ":"absatz"},{"text":"SELECT SL.SL_Name,\n       COUNT(DISTINCT VA.VA_ID) AS AnzahlVeranstaltungen,            1P\n       COUNT(KA.KA_ID) AS VerkaufteKarten,\n       AVG(KA.KA_Preis) AS MittlererPreis                            2P\nFROM Saal AS SL\n     INNER JOIN Veranstaltung AS VA ON VA.SL_ID = SL.SL_ID\n     LEFT JOIN Karte AS KA ON KA.VA_ID = VA.VA_ID                    1P\nWHERE YEAR(VA.VA_Beginn) = 2026                                      1P\nGROUP BY SL.SL_ID, SL.SL_Name                                        1P\nHAVING COUNT(DISTINCT VA.VA_ID) >= 12                                1P\nORDER BY SL.SL_Name ASC;                                             1P\n                                                                   = 8P","typ":"code"},{"text":"Bewertungshinweise:","typ":"ueberschrift"},{"text":"Entscheidend ist das Schluesselwort DISTINCT beim Zaehlen der Veranstaltungen. Durch den Verbund mit Karte erscheint jede Veranstaltung so oft, wie Karten zu ihr verkauft wurden. Ein einfaches COUNT(VA.VA_ID) liefert daher die Kartenzahl statt der Veranstaltungszahl und ist falsch. Der zugehoerige Punkt entfaellt; die gleiche Zaehlung in der HAVING-Klausel wird dann als Folgefehler nicht erneut bestraft.","typ":"absatz"},{"text":"Die Einschraenkung muss sich auf VA_Beginn beziehen. Ein Filter auf KA_Verkaufsdatum trifft den Vorverkauf und nicht den Veranstaltungszeitraum und ist fachlich falsch.","typ":"absatz"},{"text":"Ein Datumsvergleich mit BETWEEN oder zwei Vergleichsoperatoren auf VA_Beginn ist gleichwertig zur Funktion YEAR.","typ":"absatz"},{"text":"Der LEFT JOIN auf Karte ist erforderlich, damit Veranstaltungen ohne verkaufte Karte bei der Veranstaltungszahl mitgezählt werden. COUNT(KA.KA_ID) liefert für diese Veranstaltungen korrekt null verkaufte Karten.","typ":"absatz"},{"text":"Die Mindestzahl von zwoelf Veranstaltungen gehoert in die HAVING-Klausel. Eine Formulierung mit dem Alias AnzahlVeranstaltungen ist zulaessig, sofern das verwendete Datenbanksystem dies unterstuetzt.","typ":"absatz"},{"text":"ASC darf entfallen, da aufsteigend die Voreinstellung ist. Fehlt ORDER BY vollstaendig, entfaellt der Punkt.","typ":"absatz"}],"operator_id":"operator.erstellen","pruefungszuordnung":{"berufe":["FIAE","FIDP"],"teil":"AP2"},"punkte":8,"punkterahmen":{"max":12,"min":2},"quellen":["ap1-2022-herbst-gesamt-a04-a-ab","ap1-2022-herbst-gesamt-a04-a-ac","ap1-2023-fruehjahr-gesamt-a04-d-da","ap1-2023-herbst-gesamt-a04-c-cb","ap1-2023-herbst-gesamt-a04-c-cc","ap2-fiae-2021-winter-ae2-a04-d","ap2-fiae-2022-sommer-ae2-a04-b-bc","ap2-fiae-2022-winter-ae2-a04-a","ap2-fiae-2023-sommer-ae2-a04-a","ap2-fiae-2023-sommer-ae2-a04-c","ap2-fiae-2024-sommer-ae2-a04-b","ap2-fiae-2024-sommer-ae2-a04-d","ap2-fiae-2025-sommer-ae2-a04-e","ap2-fiae-2025-sommer-ae2-a04-f","ap2-fiae-2025-winter-ae2-a04-b","ap2-fiae-2025-winter-ae2-a04-c","ap2-fiae-2025-winter-ae2-a04-e","ap2-fiae-2026-sommer-ae2-a04-b","ap2-fiae-2026-sommer-ae2-a04-c-ca","ap2-fidp-2021-winter-fdp2-a02-e","ap2-fidp-2023-sommer-fdp2-a03-b-bb","ap2-fidp-2023-sommer-fdp2-a03-b-bc","ap2-fidp-2024-sommer-fdp2-a03-d-da","ap2-fidp-2024-sommer-fdp2-a03-d-db","ap2-fidp-2025-winter-fdp2-a03-c","ap2-fidp-2025-winter-fdp2-a03-d","ap2-fidp-2026-sommer-fdp2-a04-b","ap2-fidp-2026-sommer-fdp2-a04-c"]}],"konzept_id":"fachkonzept.sql-aggregation-und-gruppierung","schema_version":3}