Laden...

Datenbankabfrage und Summe

Erstellt von Kuehner vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.366 Views
K
Kuehner Themenstarter:in
489 Beiträge seit 2006
vor 14 Jahren
Datenbankabfrage und Summe

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

D
496 Beiträge seit 2005
vor 14 Jahren

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."

K
Kuehner Themenstarter:in
489 Beiträge seit 2006
vor 14 Jahren

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

D
496 Beiträge seit 2005
vor 14 Jahren

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."

K
Kuehner Themenstarter:in
489 Beiträge seit 2006
vor 14 Jahren

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

D
496 Beiträge seit 2005
vor 14 Jahren

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."

K
Kuehner Themenstarter:in
489 Beiträge seit 2006
vor 14 Jahren

Danke. Jetzt geht´s.

1.564 Beiträge seit 2007
vor 14 Jahren

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ß.

K
Kuehner Themenstarter:in
489 Beiträge seit 2006
vor 14 Jahren

Was von den beiden ist denn dann ählicher dem text? nvarchar oder varchar?

1.564 Beiträge seit 2007
vor 14 Jahren

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ß.

K
Kuehner Themenstarter:in
489 Beiträge seit 2006
vor 14 Jahren

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??)

1.564 Beiträge seit 2007
vor 14 Jahren

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ß.