# Fehler im SQL ...



## Tobias (24. Jun 2009)

Hi,

ich habe eine (eigentlich sehr simple) Tabelle mit drei Spalten "MEMBER_ID", "COURSE_ID" und "PART_DATE":


```
CREATE table APP.PARTICIPATION
(MEMBER_ID INTEGER CONSTRAINT member_fk REFERENCES MEMBERS(ID), 
COURSE_ID INTEGER CONSTRAINT course_fk REFERENCES COURSES(ID), 
PART_DATE DATE)
```

Aus dieser Tabelle möchte ich jetzt pro Member herauslesen, wie oft das Mitglied welchen Kurs in einem bestimmten Zeitraum besucht hat:


```
SELECT COUNT(DISTINCT COURSE_ID) AS PART_COURSE, COURSE_ID, MEMBER_ID 
FROM PARTICIPATION 
WHERE PART_DATE >= ? AND PART_DATE <= ? 
GROUP BY MEMBER_ID
```

Die Fragezeichen werden mit den jeweiligen Anfangs- bzw Enddaten des fraglichen Zeitraums ersetzt. Leider quittiert Derby mir diese Anfrage mit folgender Exception:



> ERROR 42Y36: Column reference 'COURSE_ID' is invalid, or is part of an invalid expression.  For a SELECT list with a GROUP BY, the columns and expressions being selected may only contain valid grouping expressions and valid aggregate expressions.



Wie muß meine Anfrage denn dann richtig lauten? Und warum bekomme ich diesen Fehler?

mpG
Tobias


----------



## SlaterB (24. Jun 2009)

die Fehlermeldung sagt alles, schreibe
GROUP BY MEMBER_ID, COURSE_ID

das count() wird dann aber nicht viel zu zählen haben..


----------



## Tobias (24. Jun 2009)

Das löst zwar das Problem, ist aber eigentlich nicht das, was ich haben will ...

Ich möchte ja ein ResultSet bekommen, das folgende Struktur hat:


```
MEMBER_ID | COURSE_ID | PART_COURSE
1           10           6
2            3          15
...
```

Zur Not kann ich mir die Spalte PART_COURSE natürlich "per Hand" ausrechnen, aber so richtig gut erscheint mir das nicht.


----------



## SlaterB (24. Jun 2009)

falls da eine Frage dabei war müsstest du mir erst erklären, worum es geht,
wenn man nach COURSE_ID gruppiert, also eine spezielle COURSE_ID = 10 betrachtet, was soll dann der Count zählen?
es gibt nicht mehrere COURSE_ID für genau eine COURSE_ID = 10 

vielleicht
COUNT(*)
?


----------



## Tobias (24. Jun 2009)

In der Tabelle stehen folgende Daten:

MEMBER_ID <- Id des Mitglieds
COURSE_ID <- Id des Kurses
PART_DATE <- Datum, an dem das entsprechende Mitglied den entsprechenden Kurs besucht hat

Mitglieder besuchen einen Kurs in der Regel mehrfach (an unterschiedlichen Tagen), ein Mitglied (MEMBER_ID sei 1) war zum Beispiel am Mittwoch der Kalenderwoche 1 und am Mittwoch der KW 2 im Kurs "Mathematik" (COURSE_ID sei 3).

Dann soll meine Abfrage ergeben: Mitglied 1 hat Kurs 3 zweimal besucht. Letztlich geht es um einen Bericht für den Kursleiter, damit der bei der Prüfung schauen kann, wieviele Fehlzeiten die einzelnen Mitglieder haben.


----------



## SlaterB (24. Jun 2009)

wie gesagt:
COUNT(*)

du willst die Anzahl der Teilnahmen = Einträge in PARTICIPATION zählen, 
nicht die Anzahl der COURSE_ID denn die kann ja nur 1 sein, wenn du nach COURSE_ID gruppierst


----------



## Tobias (24. Jun 2009)

Nein, ich möchte feststellen, wie oft eine bestimmte Kombination von MEMBER_ID und COURSE_ID vorkommt, die Spalte PART_DATE wird dabei nur als Selektionskriterium benutzt.


----------



## SlaterB (24. Jun 2009)

vertraue mir, davon spreche ich auch 

SELECT COUNT(*) AS PART_COURSE, COURSE_ID, MEMBER_ID 
FROM PARTICIPATION 
WHERE PART_DATE >= ? AND PART_DATE <= ? 
GROUP BY MEMBER_ID, COURSE_ID


probier es doch erstmal aus und vergleiche es mit den Rohdaten


----------



## Tobias (24. Jun 2009)

Naja, den Vergleich hatte ich schon gemacht - allerdings zu flüchtig. Meine Rohdaten (bzw meine Interpretation davon) war verkehrt, nicht dein Query. Vielen Dank!!


----------

