verwendetes Datenbanksystem: SQLServer 2008 (Express)
Hallo,
Ich bin leider nicht der Held, was Datenbankanwendungen betrifft.
Ich habe folgende "einfache" Aufgabe für einen von euch:
Nehmen wir an, wir haben folgende Tabellen (Fallbeispiel):
Tabelle Persons:
TableName: Persons
PersonID | PersonName
--------------------------------
4 | Franz
5 | Gustav
6 | Klaus
Tabelle Bälle:
TableName: Balls
BallId | PersonID | Anzahl | Farbe
---------------------------------------------------------------------
1 | 4 | 5 | rot
2 | 5 | 4 | blau
3 | 4 | 3 | grün
4 | 4 | 7 | gelb
5 | 6 | 6 | rot
6 | 5 | 1 | grün
Es bekommt eben jeder ab und zu mal Bälle geschenkt. Nun möchte ich wissen, wieviele Bälle wer besitzt.
Hier mein Ansatz, der irgendwie nicht funktioniert:
SELECT p.PersonID, p.PersonName, SUM(Balls.Anzahl) AS SummeBall
FROM Persons AS p INNER JOIN
Balls ON p.PersonID = Balls.PersonID
ORDER BY p.PersonName
Fehlermeldung:
Persons.PersonID ist in der Auswahlliste ungültig, da sie nicht in einer Aggregatsfunktion und nicht in der GROUP BY-Klausel enthalten ist
du musst halt alles was keine funktion wie sum oder min im select hat in die groupy by clause packen
also:
SELECT p.PersonID, p.PersonName, SUM(Balls.Anzahl) AS SummeBall
FROM Persons AS p INNER JOIN
Balls ON p.PersonID = Balls.PersonID
GROUP BY
p.PersonID,
p.PersonName
ORDER BY p.PersonName
"Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life."
Ok, danke! Das hat mich schon mal sehr weiter gebracht.
Mein Problem ist jetzt noch:
PersonName ist bei mir vom Datentyp text.
Die Fehlermeldung lautet nun:
Die Datentypen 'text', 'ntext' und 'image' können nur mithilfe des Operators IS NULL oder LIKE verglichen oder sortiert werden.
Also irgendwie verstehe ich das nicht ganz. Ich möchte doch nichts sortieren...
poste noch mal deinen kompletten sql string und von welchem datentyp ist personid?
"Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life."
Hallo,
Sorry. PersonID ist vom Datentyp int. Was ich vergessen habe:
p.PersonName ist in Wirklichkeit SUBSTRING(p.PersonaName, 0, 3)... also etwa so:
SELECT p.PersonID, SUBSTRING(p.PersonName,0,10) AS PName, SUM(Balls.Anzahl) AS SummeBall
FROM Persons AS p INNER JOIN
Balls ON p.PersonID = Balls.PersonID
GROUB BY p.PersonID, PName
ORDER BY p.PersonName
aha, dann sollte es heissen:
SELECT p.PersonID,
SUBSTRING(p.PersonName,0,10) AS PName,
SUM(Balls.Anzahl) AS SummeBall
FROM
Persons AS p INNER JOIN
Balls ON p.PersonID = Balls.PersonID
GROUB BY
p.PersonID,
SUBSTRING(p.PersonName,0,10)
ORDER BY
PName
ungetestet
"Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life."
Kleiner Tipp am Rande:
TEXT und NTEXT sind seit SQL Server 2005 als deprecated markiert und werden im nächsten SQL Server sicher rausfliegen.
Ich empfehle dir auf VARCHAR(MAX)/NVARCHAR(MAX) zu wechseln. Dann hast du auch das Problem mit dem GROUP BY nicht mehr.
Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+
Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.
Was von den beiden ist denn dann ählicher dem text? nvarchar oder varchar?
TEXT ist non-Unicode, also VARCHAR(MAX)
NTEXT ist Unicode, also NVARCHAR(MAX)
Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+
Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.
Ok, jetzt ist nochmal ein Problem in meiner Anwendung aufgetaucht.
Das obige Kommando funktioniert nun einwandfrei... vorausgesetzt jede Person hat mindestens einen Ball.
Doch was kann ich tun, wenn eine Person keinen Ball besitzt? Dann ist diese ja auch nicht in der Tabelle "Balls". Ich möchte jedoch, dass die Person dann trotzdem ausgegeben wird... eben dann mit Summe = 0, wenn noch kein Ball eingetragen wurde. Im Moment erscheint die Person nicht (ich nehme an, man muss an dem INNER JOIN oder so was ändern??)
Mach' aus dem INNER JOIN einen LEFT JOIN und pack dein SUM() in ein ISNULL:
SELECT p.PersonID, SUBSTRING(p.PersonName,0,10) AS PName, ISNULL(SUM(Balls.Anzahl), 0) AS SummeBall
FROM Persons AS p LEFT JOIN
Balls ON p.PersonID = Balls.PersonID
GROUP BY p.PersonID, PName
ORDER BY p.PersonName
Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+
Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.