user1000
Goto Top

Verschachtelte SQL-Abfrage

Hallo!

Ich hänge heute Nachmittag an einer SQL-Abfrage und komme nicht auf das Ergebnis. Vielleicht kann jemand helfen?

Vorhanden:

Tabelle Geräte
Geräte.ID
Geräte.Gerätemiete_Jahr_netto

Tabelle Seitenzahlen
Seitenzahlen.ID (entspricht Geräte.ID)
Seitenzahlen.Haushaltsstelle
Seitenzahlen.Jahr
Seitenzahlen.SW-Seiten
Seitenzahlen.Farbseiten

Ziel: Verteilung der Gerätemiete auf die einzelnen Haushaltsstellen anhand des Druckvolumens

Hinweis: Auf den Geräten drucken verschiedene Abteilungen.

Mein Ansatz:
SELECT Geräte.ID, Geräte.Gerätemiete_Jahr_netto, Seitenzahlen.Haushaltsstelle, SUM(Seitenzahlen.[SW-Seiten]) AS SummeSWSeiten, SUM(Seitenzahlen.Farbseiten) AS SummeFarbseiten, SummeSWSeiten+SummeFarbseiten AS GedruckteSeiten, GedruckteSeiten/(SELECT Sum(Seitenzahlen.[SW-Seiten])+Sum(Seitenzahlen.Farbseiten) AS GedruckteSeiten
FROM Seitenzahlen
WHERE (((Seitenzahlen.Jahr)=[Geben Sie das Jahr ein:]) AND Seitenzahlen.ID=Geräte.ID)
GROUP BY Seitenzahlen.ID)*Geräte.Gerätemiete_Jahr_netto AS AnteilGerätemiete
FROM Geräte, Seitenzahlen
WHERE Geräte.ID=Seitenzahlen.ID AND Seitenzahlen.Jahr=Jahreszahl
GROUP BY Geräte.ID, Geräte.Gerätemiete_Jahr_netto, Seitenzahlen.Haushaltsstelle

Damit bekomme ich die Grundtabelle:
Geräte-ID | Gerätemiete_Jahr_netto | Haushaltsstelle | Summe SW-Seiten | Summe Farbseiten | Summe gedruckte Seiten | Anteil Gerätemiete

=> Alle Geräte, alle Haushaltsstellen zu den Geräten und das jeweilige Druckaufkommen sowie anhand des Druckaufkommens der Gerätemieteanteil.


Nun hätte ich gerne die einzelnen Gerätemieteanteile summiert und gruppiert anhand der Haushaltsstellen. Also dass die Zieltabelle so aussieht:
Haushaltsstelle | Anteil Gerätemiete

Hat jemand einen Tip, wie ich das hinbekomme?

Ich glaube ich stehe auf dem Schlauch...

Content-ID: 325342

Url: https://administrator.de/forum/verschachtelte-sql-abfrage-325342.html

Ausgedruckt am: 23.12.2024 um 03:12 Uhr

em-pie
Lösung em-pie 03.01.2017, aktualisiert am 04.01.2017 um 09:11:53 Uhr
Goto Top
Hi,

dein Statement wäre etwas anpassungsfähig (siehe folgenden Code). Ich habe hier mal die Verknüpfung deiner Tabellen mit Inner Joins umgesetzt. Ich habe hier auch gleich die - so denke ich - Lösung für dein Problem mit eingebaut (Zeile 1 - 5 und 27-29).

SELECT 
	Haushaltsstelle
	, SUM(AnteilGerätemiete)
FROM
	(
		SELECT 
			Geräte.ID
			, Geräte.Gerätemiete_Jahr_netto
			, Seitenzahlen.Haushaltsstelle
			, SUM(Seitenzahlen.[SW-Seiten]) AS SummeSWSeiten
			, SUM(Seitenzahlen.Farbseiten) AS SummeFarbseiten
			, SUM(Seitenzahlen.[SW-Seiten]) + SUM(Seitenzahlen.Farbseiten) AS Seiten_AlleDrucker
			, (((SUM(Seitenzahlen.[SW-Seiten]) + SUM(Seitenzahlen.Farbseiten))
			   / TBl2.Seiten_jeDrucker) 
			   * Geräte.Gerätemiete_Jahr_netto AS AnteilGerätemiete
		FROM 
			Geräte as Tbl1
		INNER JOIN 
			(
				SELECT Seitenzahlen.ID, 
					, Sum(Seitenzahlen.[SW-Seiten]) 
					  + Sum(Seitenzahlen.Farbseiten) AS Seiten_jeDrucker
				FROM Seitenzahlen
				WHERE (Seitenzahlen.Jahr)=[Geben Sie das Jahr ein:] AND Seitenzahlen.ID = Geräte.ID
				GROUP BY Seitenzahlen.ID
			) as Tbl2 on Tbl1.ID = Tbl2.ID
		WHERE 
			Seitenzahlen.Jahr=Jahreszahl
		GROUP BY 
			Geräte.ID, Geräte.Gerätemiete_Jahr_netto, Seitenzahlen.Haushaltsstelle
	)
GROUP BY
	Haushaltsstelle


Hoffe, habe nichts versehentlich ausgelassen (habe den Code jetzt nicht getestest)

Teste das aber einfach mal...

Gruß
em-pie
ukulele-7
ukulele-7 04.01.2017 um 08:56:06 Uhr
Goto Top
Falls das nicht schon gehen sollte, welche SQL DB wird genutzt?
User1000
User1000 04.01.2017 aktualisiert um 11:10:00 Uhr
Goto Top
Hallo em-pie,

herzlichen Dank für die Hilfe! Ich habe gestern so viel herumprobiert und dabei komplett den Überblick verloren....

Dein Vorschlag sieht prima aus. Hab zwei Kleinigkeiten korrigieren müssen: Ein Komma und eine Klammer waren zu viel/zu wenig. Außerdem kommt MS Access scheinbar nicht mit Berechnungsaufgaben klar, die durch Leerzeichen/Zeilenumbrüche getrennt sind. Hab das korrigiert:

SELECT 
	Haushaltsstelle
	, SUM(AnteilGerätemiete)
FROM
	(
		SELECT 
			Geräte.ID
			, Geräte.Gerätemiete_Jahr_netto
			, Seitenzahlen.Haushaltsstelle
			, SUM(Seitenzahlen.[SW-Seiten]) AS SummeSWSeiten
			, SUM(Seitenzahlen.Farbseiten) AS SummeFarbseiten
			, (SUM(Seitenzahlen.[SW-Seiten]) + SUM(Seitenzahlen.Farbseiten)) AS Seiten_AlleDrucker
			, (((SUM(Seitenzahlen.[SW-Seiten]) + SUM(Seitenzahlen.Farbseiten))/Tbl2.Seiten_jeDrucker)*Geräte.Gerätemiete_Jahr_netto) AS AnteilGerätemiete
		FROM 
			Geräte as Tbl1
		INNER JOIN 
			(
				SELECT Seitenzahlen.ID 
					, (Sum(Seitenzahlen.[SW-Seiten])+Sum(Seitenzahlen.Farbseiten)) AS Seiten_jeDrucker
				FROM Seitenzahlen, Geräte
				WHERE Seitenzahlen.Jahr=2016 AND Seitenzahlen.ID = Geräte.ID
				GROUP BY Seitenzahlen.ID
			) as Tbl2 on Tbl1.ID = Tbl2.ID
		WHERE 
			Seitenzahlen.Jahr=2016
		GROUP BY 
			Geräte.ID, Geräte.Gerätemiete_Jahr_netto, Seitenzahlen.Haushaltsstelle
)
GROUP BY
	Haushaltsstelle

Leider funktioniert noch nicht, es kommt die folgende Fehlermeldung:

Sie wollten eine Abfrage ausführen, die den angegebenen Ausdruck
'(SUM(Seitenzahlen.[SW-Seiten]) + SUM(Seitenzahlen.Farbseiten))/Tbl2.Seiten_jeDrucker)*Geräte.Gerätemiete_Jahr_netto'
nicht als Teil der Aggregatfunktion einschließt. (Fehler 3122)

Ich habe schon versucht "AnteilGerätemiete" zum GROUP BY mitaufzunehmen. Aber das brachte leider keine Besserung. Hat jemand von euch nochmals eine Idee? Vermutlich ist es nur eine Kleinigkeit, die ich übersehe.

Ich hatte bislang mit SQL-Abfragen wenig zu tun. Bislang kam ich immer mit den Standard-SELECT-, UPDATE- und INSERT-Befehle aus, ohne komplexe Verschachtelungen wie bei diesem Fall...
User1000
User1000 04.01.2017 um 12:07:37 Uhr
Goto Top
Hab's nun anders hinbekommen:

SELECT Haushaltsstelle, SUM(SummeSWSeiten) AS GedruckteSWSeiten, SUM(SummeFarbseiten) AS GedruckteFarbseiten, ROUND(GedruckteFarbseiten*(SELECT Seitenpreis FROM Seitenpreise WHERE Typ="Farbseite"), 2) AS Farbseitenkosten, SUM(AnteilGerätemiete) AS AnteilFixkosten  
FROM  (SELECT Geräte.ID, Geräte.Typ, Geräte.Standort, Geräte.Gerätemiete_Jahr_netto, Seitenzahlen.Haushaltsstelle, SUM(Seitenzahlen.[SW-Seiten]) AS SummeSWSeiten, SUM(Seitenzahlen.Farbseiten) AS SummeFarbseiten, SummeSWSeiten+SummeFarbseiten AS GedruckteSeiten, ROUND(GedruckteSeiten/(SELECT Sum(Seitenzahlen.[SW-Seiten])+Sum(Seitenzahlen.Farbseiten) AS GedruckteSeiten
FROM Seitenzahlen
WHERE (((Seitenzahlen.Jahr)=Jahreszahl) AND Seitenzahlen.ID=Geräte.ID)
GROUP BY Seitenzahlen.ID)*Geräte.Gerätemiete_Jahr_netto, 2) AS AnteilGerätemiete
FROM Geräte, Seitenzahlen
WHERE Geräte.ID=Seitenzahlen.ID AND Seitenzahlen.Jahr=Jahreszahl
GROUP BY Geräte.ID, Geräte.Typ, Geräte.Standort, Geräte.Gerätemiete_Jahr_netto, Seitenzahlen.Haushaltsstelle
)  AS [%$##@_Alias]
GROUP BY Haushaltsstelle;