Hilfe bei Abfrage

myerscola

Benutzer
Beiträge
8
Hallo,
ich bin neu hier und sicher kein SQL-Crack.
Ich soll jetzt aus einer Tabelle eines Sportvereins eine Abfrage generieren und habe keine Idee wie ich es anfange.
In der Tabelle stehen Name,Vorname, Mitgliedsnummer, Eintrittsdatum, Eintrittszaehler. Die Trainer nehmen bei ihren Eintritten immer Schüler auf ihre Karte mit, d.h. das sie an einem Tag unter Umtänden 20 Besuche in der Tabelle haben.

Die Abfrage soll jetzt als Ergebnis die Auswertung eines Monats sein, in der dann die jeweiligen Ersteintritte und der mitgenommenen Schüler, also Ergebnis z.B. für September:
Name Vorname Mitgliedsnummer Eigene Besuche Schuelerbesuche
-------'------------'---------------------'--------------------'------------
Muster Peter 0815 7 54
Weiss Tina 4711 8 123

Ich hoffe das Problem ist verständlich und vor allem das mir jemand helfen kann.

Danke und Gruß myerscola
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.582
Was verstehst du unter einem Eintritt? Was genau zählt der Eintrittszähler? Wird das Eintrittsdatum jedesmal überschrieben oder gibt es in der Tabelle mehrere Einträge zur selben Person?
 

myerscola

Benutzer
Beiträge
8
Hallo,
das Ganze ist ein System mit Transponder und jedesmal wenn jemand den Leser betätigt gibt es einen neuen Eintrag in eine Tabelle Eintritte der DB. Das Wort Eintrittszaehler wundert mich auch, da steht immer 1 drin.
Also pro Eintritt eine neue Zeile in dieser Tabelle.
Ich habe bisher eine Abfrage so gemacht:
Code:
SELECT MITGLIEDSNUMMER, COUNT(MITGLIEDSNUMMER) AS Anzahl_Besuche, Name
FROM EINTRITTE where  Month(EINTRITTSDATUM) = 10  and YEAR(EINTRITTSDATUM) = 2013
GROUP BY MITGLIEDSNUMMER
HAVING ( COUNT(MITGLIEDSNUMMER) > 1 )
Jetzt wird aber gewünscht , das die Eintritte des Trainers separiert werden, also nur der 1. Eintritt pro Tag dem Trainer als Eigeneintritt zugeordnet wird und alle Weiteren summiert dem Trainer als Schülereintritte zugeordnet werden.
 

akretschmer

Datenbank-Guru
Beiträge
9.423
Hallo,
das Ganze ist ein System mit Transponder und jedesmal wenn jemand den Leser betätigt gibt es einen neuen Eintrag in eine Tabelle Eintritte der DB. Das Wort Eintrittszaehler wundert mich auch, da steht immer 1 drin.
Also pro Eintritt eine neue Zeile in dieser Tabelle.
Ich habe bisher eine Abfrage so gemacht:
Code:
SELECT MITGLIEDSNUMMER, COUNT(MITGLIEDSNUMMER) AS Anzahl_Besuche, Name
FROM EINTRITTE where  Month(EINTRITTSDATUM) = 10  and YEAR(EINTRITTSDATUM) = 2013
GROUP BY MITGLIEDSNUMMER
HAVING ( COUNT(MITGLIEDSNUMMER) > 1 )

Das düfte einen Syntaxfehler bringen, oder? Die Spalte 'Name' ist weger aggregiert noch gruppiert.

Jetzt wird aber gewünscht , das die Eintritte des Trainers separiert werden, also nur der 1. Eintritt pro Tag dem Trainer als Eigeneintritt zugeordnet wird und alle Weiteren summiert dem Trainer als Schülereintritte zugeordnet werden.

wie wird das unterschieden?
 

myerscola

Benutzer
Beiträge
8
Sorry, mein Fehler:

Code:
SELECT MITGLIEDSNUMMER, COUNT(MITGLIEDSNUMMER) AS Anzahl_Besuche, Name
FROM EINTRITTE where  Month(EINTRITTSDATUM) = 10  and YEAR(EINTRITTSDATUM) = 2013
GROUP BY MITGLIEDSNUMMER, Name
HAVING ( COUNT(MITGLIEDSNUMMER) > 1 )

Unterschieden wird es nicht wirklich. Es soll einfach wenn z.B. der Mustermann 10 Eintritte an einem Tag hat aufgeteilt werden in 1xTrainer 9xSchüler und das als Summe für den Monat. Da die Anzahl der Schüler immer unterschiedlich ist, kann ich aus der Monatssumme nicht direkt zurückschließen.
 

akretschmer

Datenbank-Guru
Beiträge
9.423
Sorry, mein Fehler:

Code:
SELECT MITGLIEDSNUMMER, COUNT(MITGLIEDSNUMMER) AS Anzahl_Besuche, Name
FROM EINTRITTE where  Month(EINTRITTSDATUM) = 10  and YEAR(EINTRITTSDATUM) = 2013
GROUP BY MITGLIEDSNUMMER, Name
HAVING ( COUNT(MITGLIEDSNUMMER) > 1 )

Unterschieden wird es nicht wirklich. Es soll einfach wenn z.B. der Mustermann 10 Eintritte an einem Tag hat aufgeteilt werden in 1xTrainer 9xSchüler und das als Summe für den Monat. Da die Anzahl der Schüler immer unterschiedlich ist, kann ich aus der Monatssumme nicht direkt zurückschließen.

Dann einfach zählen, 1 ist fest für den Trainer und count()-1 ist dann Anzahl der Schüler.
 

ukulele

Datenbank-Guru
Beiträge
4.582
Das heißt die erste Person an einem Tag ist immer Trainer und alle anderen sind Schüler? Oder können auch mehrere Trainer mit Schülern am selben Tag kommen?
 

myerscola

Benutzer
Beiträge
8
Das haut leider nicht hin. Wenn ich immer minus 1 mache, berücksichtige ich die Anuahl der Tage nicht richtig.

@ukulele - ja, der Trainer ist immer der Erste und nur der erste Eintrit am Tag soll auch gezählt werden. Die Schüler benutzen auch seinen Chip zum Eintreten. Es können auch mehrere Trainer am Tag kommen aber die haben dann eine andere Mitgliedsnummer.
 

ukulele

Datenbank-Guru
Beiträge
4.582
In etwa so könnte es gehen:
Code:
SELECT   t.name,
     t.vorname,
     t.mitgliedsnummer,
     left(t.eintrittsdatum,6) AS Eintrittsdatum,
     count(*) AS [Eigene Besuche],
     sum(t.anzahl) - count(*) AS Schuelerbesuche
FROM   (
SELECT   name,
     vorname,
     mitgliedsnummer,
     convert(CHAR(8), eintrittsdatum, 112) AS eintrittsdatum,
     count(*) AS anzahl
FROM   eintritte
GROUP BY name,vorname,mitgliedsnummer,convert(CHAR(8), eintrittsdatum, 112)
)t
GROUP BY t.name,t.vorname,t.mitgliedsnummer,left(t.eintrittsdatum,6)
ORDER BY t.name,t.vorname
 
Werbung:

myerscola

Benutzer
Beiträge
8
So Ukulele, hat es was länger gedauert die Zahlen zu überprüfen. Das ist die Lösung, klappt perfekt. Du hast es echt drauf
Vielen Dank für die Hilfe.
LG myerscola
 
Oben