l0c4lh0st
Goto Top

SQL Abfrage benötige euer Fachwissen

Servus,

habe hier ein Problem mit einer SQL Abfrage und komme nicht weiter.

Also die Aufgabe:

Wir haben eine SQL Datenbank mit mehreren Tabellen.

Ich soll eine Abfrage gestalten, die mir den Gesamtwert des Buchbestands anzeigt.
Allerdings muss ich das ganze Variabel halten, d.h. wenn wir von einem buch 2,3 oder 5 exemplare haben, muss das mit in das Ergebnis aufgenommen werden.

Hier mal die Frage wie sie in der Aufgabe steht:
Der Gesamtwert des Buchbestandes soll ausgegeben werden

So wir benötigen 2 Tabellen zur auswertung und zwar die Tabelle "buecher" und die Tabelle "buchexemplar".

buecher
- ISBN
- Kaufpreis

buchexemplar
- ISBN
- Exemplarnummer

Wie bekomm ich das hin?
Mit LEFT JOIN die ISBN's verbinden nehme ich an?
Aber wie multipliziere ich den Kaufpreis jedes einzelnen Buches mit seiner Anzahl und rechne das zum schluss zusammen?

Hoffe das ist halbwegs verständlich

MfG
L0c4lh0sT

Content-Key: 129205

Url: https://administrator.de/contentid/129205

Printed on: April 25, 2024 at 07:04 o'clock

Member: -ricardo-
-ricardo- Nov 12, 2009 at 09:51:23 (UTC)
Goto Top
Hmm wenn schon dann ein Inner Join der beiden Tabellen, damit auch jedes Exemplar mit auf genommen wird ...

SELECT SUM(Kaufpreis) as Gesamtwert
FROM buecher INNER JOIN buchexemplar ON buecher.isbn=buchexemplar.isbn ...

So in der art dürfte es klappen ...
Member: L0c4lh0sT
L0c4lh0sT Nov 12, 2009 at 09:59:29 (UTC)
Goto Top
So beachtet die Abfrage aber nicht, dass es mehrere Exemplare geben kann.
Und da hapert es ja gerade.
Member: perseues
perseues Nov 12, 2009 at 10:17:03 (UTC)
Goto Top
Hallo,

Du brauchst etwas im Sinne von (ungetestet):

SELECT sum(buecher.kaufpreis*buchexemplar.exemplarnummer) AS Summe
FROM buecher
JOIN buchexemplar
ON buecher.isbn = buchexemplar.isbn;
GO

Grüße p
Member: -ricardo-
-ricardo- Nov 12, 2009 at 10:19:29 (UTC)
Goto Top
buecher
- ISBN
- Kaufpreis

buchexemplar
- ISBN
- Exemplarnummer

ist ja auch nirgendwo ne anzahl mit angegeben oder soooll "Exemplarnummer" die anzahl darstellen... wenn ja dann ist die bezeichnung etwas dumm :D

du kannst auch im sum zwei felder multiplizieren ....
da gibt es aber 1.000.000 beispiele wenn du mal googelst ... also wenn man etwas mit denkt, dann kann man diese auch umsetzten :D

http://www.sql-und-xml.de/server-daten/sql-befehle/

falls du zu faul zum suchen bist ;)
Member: L0c4lh0sT
L0c4lh0sT Nov 12, 2009 at 10:20:40 (UTC)
Goto Top
OK habs jetzt durch viel gefrikkel geschafft.

DIe Abfrage sollte so aussehen:

SELECT SUM(buecher.Kaufpreis * buchexemplar.Exemplarnummer) as GesamtPreis from buecher
Inner Join buchexemplar ON buecher.ISBN = buchexemplar.ISBN
where buecher.ISBN = buchexemplar.ISBN
Member: L0c4lh0sT
L0c4lh0sT Nov 12, 2009 at 10:21:41 (UTC)
Goto Top
Okay doch noch net zu machen^^
Hab noch ne zweite Aufgabe an der ich kläglich scheitere.

Ich soll jetzt alle Bücher anzeigen, die mehr als einen Autor haben.

Dazu benötige ich 3 Tabellen.

buecher
- ISBN
- Titel

buchautor
- ISBN
- AutorenNr

autoren
- AutorenNr
- Vorname
- Nachname

Es sollen also alle Bücher angezeigt werden, die mehr als einen Autor haben.
Die Daten zusammensammeln ist kein Problem.
Aber die Ausgabe bereitet mir schwierigkeiten, da ich nicht weiß wie ich die Abfrage formulieren soll.

Wenn jemand noch ne Idee hat immer her damit
Member: -ricardo-
-ricardo- Nov 12, 2009 at 11:47:56 (UTC)
Goto Top
Dann musst du ja schon eine Abfrage gemacht haben, wenn du die Daten zusammen bekommst?!
Member: L0c4lh0sT
L0c4lh0sT Nov 12, 2009 at 11:50:04 (UTC)
Goto Top
Theoretisch bekomme ich die Daten zusammen^^
Also ich weiß was ich für Werte brauche. Aber leider nicht wie ich das meiner Datenbank sagen soll.
Member: -ricardo-
-ricardo- Nov 12, 2009 at 12:10:20 (UTC)
Goto Top
Sag sie mal mir, weil ich stehe momentan etwas auf dem schlauch :D dann kriegst du vielleicht eine SQL Querry
Member: L0c4lh0sT
L0c4lh0sT Nov 12, 2009 at 12:27:20 (UTC)
Goto Top
Hab jetzt schon ne Abfrage gefunden allerdings eine 2 Teilige. Also 2 mal Select mit drin also etwas unschön.
Wenn jemand möchte kann er das ja zusammenfassen^^

SELECT buecher.ISBN, buecher.Titel, autoren.Vorname, autoren.Nachname From buecher
LEFT JOIN buchautor ON buecher.ISBN = buchautor.ISBN
LEFT JOIN Autoren ON buchautor.AutorenNr = autoren.AutorenNr
Where buchautor.ISBN IN (
SELECT buchautor.ISBN
FROM buchautor
GROUP BY buchautor.ISBN
HAVING Count(1) > '1'
)
ORDER BY buecher.Titel
Member: Biber
Biber Nov 13, 2009 at 16:16:36 (UTC)
Goto Top
Moin L0c4lh0sT,

drei Anmerkungen zu deiner Query.

1. Wenn die Query das richtige Ergebnis liefert, dann ist die "Länge" des formulierten Statements dritt- oder viertrangig.
Wenn überhaupt etwas von Bedeutung ist, dann die gewählten Zugriffspfade, die Performanz--> alles, was du über ein EXPLAIN untersuchen kannst.

2. Ein LEFT JOIN in dem untersuchten Zusammenhang kann nur unnötig Zeit kosten, da (soweit uns bekannt ist) keine RIs definiert sind, die sicherstellen, dass in der Buchautor nur ISBNs und Autorennr'n erfasst sind, die es auch in Buechern und Autoren gibt.
Möglicherweise hast du ja 2000 Bücher in der Buechertabelle und 5000 Autoren in der Autoren-Tabelle, die jeweils nichts miteinander zu tun haben.
Und bei dem, was du betrachtest interessieren nur die echten JOINs (ohne LEFT)

3. Ein HAVING Count(1) > '1' ist Grütze..... eine Anzahl kann niemals einen Zeichenwert "Ziffer 1" ergeben.

Also belass es bei
SELECT buecher.ISBN, buecher.Titel, autoren.Name, autoren.vorname  
FROM buecher, buchautor, autoren
WHERE buecher.ISBN = buchautor.ISBN
AND buchautor.autorennr = autoren.autorennr
AND Buchautor.isbn IN (
SELECT buchautor.ISBN
FROM buchautor
GROUP BY buchautor.ISBN
HAVING Count(1) > 1
)
ORDER BY buecher.Titel
[ungetestet]

Und wenn du da etwas tunen willst-...
--> dann nur wenn es ein EXPLAIN es nahelegt und nicht weil es mehr 5 Zeilen oder mehr als ein Schlüsselwort SELECT hat.

Grüße
Biber
Member: L0c4lh0sT
L0c4lh0sT Nov 14, 2009 at 00:21:53 (UTC)
Goto Top
Danke für deine, wie immer super exakte antwort! Aber....jetzt kommt's!
Ich habe die aufgabe von meinem Ausbilder bekommen, welcher meint dass es mit einem SELECT sein soll.
Aber wie es geht will er mir nicht erklären...

Also wenn jemand noch ne lösung hat ohne 2. select wäre ich sehr dankbar.
Member: Biber
Biber Nov 15, 2009 at 12:37:02 (UTC)
Goto Top
Moin L0c4lh0sT,

hmmm, soweit meine SQL-Kenntnisse reichen werden zwei SELECTs erforderlich sein, denn um eine Aggregierung (SELECT..GROUP BY) kommst du nicht herum.
Und ein weiteres SELECT muss dieses Ergebnis mit den Detailinfos aus den anderen beiden Tabellen verbinden... alles andere wäre für mich nicht erklärlich.
Von daher bin ich auf die Lösung dieses Rätsels genauso gespannt wie du.

Grüße
Biber
Member: MadMax
MadMax Nov 15, 2009 at 19:28:32 (UTC)
Goto Top
Moin,

solche Aufgaben sollte man genau durchlesen: die Autoren sind doch in der Abfrage gar nicht verlangt, sondern nur die Bücher, die mehrere Autoren besitzen. Also kann man die Autorendaten getrost rauslassen und einfach gruppieren, somit reicht ein Select. Da ich hier aber keine Schulaufgaben lösen will, überlasse ich die Ausformulierung der Abfrage dem geneigten Leser face-wink

Gruß, Mad Max
Member: L0c4lh0sT
L0c4lh0sT Feb 12, 2010 at 13:09:35 (UTC)
Goto Top
Vielen Dank hab ganz vergessen den Thread als gelöst zu makieren....tja so ist dass wenn einem die User die Bude einrennen^^