Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Union Abfrage gruppieren/summieren: geht das direkt?

757 views
Skip to first unread message

Franz

unread,
Nov 24, 2008, 8:06:40 AM11/24/08
to
Hallo Freunde

Ich habe eine Unionabfrage so etwa: (gekürzt, läuft)

SELECT CStr(DatePart("ww",[servisdeliverydate],2,1) & "/" & DatePart
("yyyy",[servisdeliverydate],2,1)) AS WeekNr, Sum(UnitPrice) AS sales,
Sum(Price DTC) AS DTC, Sum(Price LS] AS LS
FROM (ServisOrder INNER JOIN ServOrderMaterial ON
ServisOrder.ServOrderID = ServOrderMaterial.ServisOrderID) INNER JOIN
Products ON ServOrderMaterial.ProductID = Products.ProductID
UNION SELECT CStr(DatePart("ww",[servisdeliverydate],2,1) & "/" &
DatePart("yyyy",[servisdeliverydate],2,1)) AS WeekNr, Sum(UnitPrice)
AS sales, Sum(Price DTC) AS DTC, Sum(Price LS] AS LS
FROM (ServisOrder INNER JOIN ServOrderMaterialSales ON
ServisOrder.ServOrderID = ServOrderMaterialSales.ServisOrderID) INNER
JOIN Products ON ServOrderMaterialSales.ProductID = Products.ProductID
UNION SELECT CStr(DatePart("ww",[deliverydate],2,1) & "/" & DatePart
("yyyy",[deliverydate],2,1)) AS WeekNr, Sum(UnitPrice) AS sales, Sum
(Price DTC) AS DTC, Sum(Price LS] AS LS
FROM tblConsOrder INNER JOIN (tblConsOrderMaterial INNER JOIN Products
ON tblConsOrderMaterial.ProductID = Products.ProductID) ON
tblConsOrder.ConsOrderID = tblConsOrderMaterial.ConsOrderID;

Dies ergibt mir im "schlimmsten" Fall für jede "WeekNr" drei Records.
In einer 2. Abfrage gruppiere ich dann auf WeekNr und summiere die
Werte. Geht das auch direkt in der Union Abfrage?

Vielen Dank!

Gruss aus Prag

Franz

-----------------

Mark Doerbandt

unread,
Nov 24, 2008, 8:09:26 AM11/24/08
to
Hallo, Franz,

Franz:

> SELECT CStr(DatePart("ww",[servisdeliverydate],2,1) & "/" & DatePart
> ("yyyy",[servisdeliverydate],2,1)) AS WeekNr, Sum(UnitPrice) AS sales,
> Sum(Price DTC) AS DTC, Sum(Price LS] AS LS
> FROM (ServisOrder INNER JOIN ServOrderMaterial ON
> ServisOrder.ServOrderID = ServOrderMaterial.ServisOrderID) INNER JOIN
> Products ON ServOrderMaterial.ProductID = Products.ProductID
> UNION SELECT CStr(DatePart("ww",[servisdeliverydate],2,1) & "/" &
> DatePart("yyyy",[servisdeliverydate],2,1)) AS WeekNr, Sum(UnitPrice)
> AS sales, Sum(Price DTC) AS DTC, Sum(Price LS] AS LS
> FROM (ServisOrder INNER JOIN ServOrderMaterialSales ON
> ServisOrder.ServOrderID = ServOrderMaterialSales.ServisOrderID) INNER
> JOIN Products ON ServOrderMaterialSales.ProductID = Products.ProductID
> UNION SELECT CStr(DatePart("ww",[deliverydate],2,1) & "/" & DatePart
> ("yyyy",[deliverydate],2,1)) AS WeekNr, Sum(UnitPrice) AS sales, Sum
> (Price DTC) AS DTC, Sum(Price LS] AS LS
> FROM tblConsOrder INNER JOIN (tblConsOrderMaterial INNER JOIN Products
> ON tblConsOrderMaterial.ProductID = Products.ProductID) ON
> tblConsOrder.ConsOrderID = tblConsOrderMaterial.ConsOrderID;

erwartest Du allen Ernstes von uns, das wir das mal eben so schnell
durchlesen und auch noch inhaltlich verstehen? Wenigstens formatieren
und ein wenig erklären hättest Du können...

> Dies ergibt mir im "schlimmsten" Fall für jede "WeekNr" drei Records.
> In einer 2. Abfrage gruppiere ich dann auf WeekNr und summiere die
> Werte. Geht das auch direkt in der Union Abfrage?

Nein, sage ich mal. Ähnliche Fragestellungen kommen ja recht oft und
ich verstehe nicht, wo die Scheu herkommt, fuer eine Aufgabenstellung
eben /zwei/ Abfragen zu verwenden. Mit vernuenftiger Namenskonvention
sollte auch die Übersichtlichkeit nicht leiden.

Gruss - Mark

--
Informationen fuer Neulinge in den Access-Newsgroups unter
http://www.doerbandt.de/Access/Newbie.htm

Bitte keine eMails auf Newsgroup-Beiträge senden.

Franz

unread,
Nov 24, 2008, 9:08:41 AM11/24/08
to
Hallo Mark

> Informationen fuer Neulinge in den Access-Newsgroups unterhttp://www.doerbandt.de/Access/Newbie.htm
>
> Bitte keine eMails auf Newsgroup-Beiträge senden.- Hide quoted text -
>
> - Show quoted text -

Sorry, ich wollte niemanden erschrecken. Die Abfrage war auch eher zur
"Illustration" (ich habe Sie schon ziemlich zusammengestrichen), ich
dachte das sei eine Frage, welche eigentlich prinzipiell zu
beantworten sei (was Du ja dankenderweise gemacht hast...).
Vereinfacht also war die Frage: Kann man die Abfrage:

SELECT woche, wert from tbl1 UNION
SELECT woche, wert from tbl2 UNION
SELECT woche, wert from tbl3;

(geht doch... ;-)) )

direkt in der UNION Abfrage auf Woche gruppieren und den Wert pro
Woche summieren. Es gibt keinen anderen Grund dafür, als die Anzahl
der Abfragen zu vermindern. Die verwendeten Namen stammen überigens
(fast) nicht von mir!

Gruss + nochmals sorry!

Franz

---

Mark Doerbandt

unread,
Nov 24, 2008, 9:15:30 AM11/24/08
to
Hallo, Franz,

Franz:

> dachte das sei eine Frage, welche eigentlich prinzipiell zu
> beantworten sei (was Du ja dankenderweise gemacht hast...).
> Vereinfacht also war die Frage: Kann man die Abfrage:
>
> SELECT woche, wert from tbl1 UNION
> SELECT woche, wert from tbl2 UNION
> SELECT woche, wert from tbl3;
>
> (geht doch... ;-)) )
>
> direkt in der UNION Abfrage auf Woche gruppieren und den Wert pro
> Woche summieren. Es gibt keinen anderen Grund dafür, als die Anzahl
> der Abfragen zu vermindern.

das Problem dabei ist (neben der eher grundsaetzlichen Tatsache, dass
die Jet-Engine hier "weniger" kann als etwa der SQL Server), dass
diese Abfragen, so es denn gelingt, sie zu produzieren, oft sehr
sensibel auf kleine Änderungen sind (der QBE-Editor meint es manchmal
etwas zu gut) und ausserdem nur schwer zu lesen und damit
wartungsunfreundlich sind. Daher bevorzuge ich fuer soche Zwecke
separate Unterabfragen, die ich so nenne wie die Hauptabfrage plus
einem Postfix - dann stehen sie in der Liste der Abfragen gleich
zusammen.

Gruss - Mark

PS: kein Grund fuer ein "sorry"!

Peter Doering

unread,
Nov 24, 2008, 9:30:51 AM11/24/08
to
Hallo,

Franz wrote:


> Mark Doerbandt wrote:
>> Franz:
>>
>>> SELECT CStr(DatePart("ww",[servisdeliverydate],2,1) & "/" & DatePart

>>> [...]


>>> Dies ergibt mir im "schlimmsten" Fall für jede "WeekNr" drei Records.
>>> In einer 2. Abfrage gruppiere ich dann auf WeekNr und summiere die
>>> Werte. Geht das auch direkt in der Union Abfrage?
>>
>> Nein, sage ich mal. Ähnliche Fragestellungen kommen ja recht oft und
>> ich verstehe nicht, wo die Scheu herkommt, fuer eine Aufgabenstellung
>> eben /zwei/ Abfragen zu verwenden. Mit vernuenftiger Namenskonvention
>> sollte auch die Übersichtlichkeit nicht leiden.
>

> SELECT woche, wert from tbl1 UNION
> SELECT woche, wert from tbl2 UNION
> SELECT woche, wert from tbl3;
>

> direkt in der UNION Abfrage auf Woche gruppieren und den Wert pro
> Woche summieren. Es gibt keinen anderen Grund dafür, als die Anzahl
> der Abfragen zu vermindern. Die verwendeten Namen stammen überigens
> (fast) nicht von mir!

Du bekommst pro Abfrage im UNION-Konstrukt ein Ergebnis, kannst diese aber
in eine Unterabfrage packen und auf diese ein Group-By.

Gruss - Peter

--
Mitglied im http://www.dbdev.org
FAQ: http://www.donkarl.com

Henry Habermacher

unread,
Nov 24, 2008, 9:31:19 AM11/24/08
to
Hallo Franz

Franz wrote:
> SELECT woche, wert from tbl1 UNION
> SELECT woche, wert from tbl2 UNION
> SELECT woche, wert from tbl3;
>

> direkt in der UNION Abfrage auf Woche gruppieren und den Wert pro
> Woche summieren. Es gibt keinen anderen Grund dafür, als die Anzahl
> der Abfragen zu vermindern. Die verwendeten Namen stammen überigens

Leg' zuerst obige Abfrage mit der Union an.
Dann machst Du eine Abfrage über die Union Abfrage in der Du Gruppierst und
aufsummierst, also:

SELECT woche, sum(wert) from unionabfrage group by woche

HTH
Henry


--
Microsoft MVP Office Access
Keine E-Mails auf Postings in NGs. Danke.
Access FAQ www.donkarl.com

Thomas Winkler

unread,
Nov 24, 2008, 9:49:55 AM11/24/08
to
Hi,

> SELECT woche, sum(wert) from unionabfrage group by woche

Um alles in *einer* Abfrage zu erledigen wäre das dann:

SELECT X.woche, sum(X.wert) from
(<HierDerSQLStringDerUionAbfrage>) AS X
GROUP BY X.woche

Diese Variante solltest Du aber *wirklich* nur in Ausnahmefällen
verwenden. Unübersichtlich, wartungsunfreundlich, fehleranfällig.

HTH

Thomas

--
"Access? Damit arbeite ich nicht. Das ist doch nur ein abgespecktes Excel."

Thomas Winkler

unread,
Nov 24, 2008, 9:56:49 AM11/24/08
to
Hi,

> SELECT woche, wert from tbl1 UNION
> SELECT woche, wert from tbl2 UNION
> SELECT woche, wert from tbl3;

Du hast also n Tabellen die den gleichen (oder fast gleichen) Aufbau
haben? Beschäftige Dich mal mit Normalisierung. Wenn das ordentlich
normalisiert ist, kannst Du nämlich auch auf den Performancekiller UNION
verzichten.

Thomas Möller

unread,
Nov 24, 2008, 2:20:17 PM11/24/08
to
Hallo Franz,

Franz schrieb:


> Sorry, ich wollte niemanden erschrecken. Die Abfrage war auch eher zur
> "Illustration" (ich habe Sie schon ziemlich zusammengestrichen), ich
> dachte das sei eine Frage, welche eigentlich prinzipiell zu
> beantworten sei (was Du ja dankenderweise gemacht hast...).
> Vereinfacht also war die Frage: Kann man die Abfrage:
>
> SELECT woche, wert from tbl1 UNION
> SELECT woche, wert from tbl2 UNION
> SELECT woche, wert from tbl3;
>
> (geht doch... ;-)) )
>
> direkt in der UNION Abfrage auf Woche gruppieren und den Wert pro
> Woche summieren. Es gibt keinen anderen Grund dafür, als die Anzahl
> der Abfragen zu vermindern.

warum es nicht unbedingt von Vorteil ist, alles in eine Abfrage zu
packen hast Du ja schon gelesen.
Bleibt noch zu erwähnen, dass in einer UNION-Abfrage standardmäßig die
Dubletten ausgeblendet werden. Dieses kannst Du umgehen, wenn Du statt
"UNION" lieber "UNION ALL" schreibst. Dann beleiben auf jeden Fall alle
Datensätze erhalten.

CU
--
Thomas

Homepage: www.Team-Moeller.de

Franz

unread,
Dec 16, 2008, 9:54:45 AM12/16/08
to
Hallo zusammen

On Nov 24, 8:20 pm, Thomas Möller <Thomas_N_O_S_P_...@Team-Moeller.de>
wrote:

Falls das noch jemand liest: Erstmal sorry, anderntags hat es mich mit
Grippe erwischt, und ich habe meinen Thread schlichtwegs vergessen.
Das Problem wurde wie von Henry vorgeschlagen gelöst.
Thomas@ Die gleich strukturierten Tabellen sind aus verschiedenen
Datenbanken gelinkt.

Wollte das nur noch gesagt haben.

Gruss + Dank

Franz

----

Thomas Möller

unread,
Dec 16, 2008, 12:12:56 PM12/16/08
to
Hallo Franz,

Franz schrieb:
>>> Sorry, ich wollte niemanden erschrecken. Die Abfrage war auch eher zur
>>> "Illustration" (ich habe Sie schon ziemlich zusammengestrichen), ich
>>> dachte das sei eine Frage, welche eigentlich prinzipiell zu
>>> beantworten sei (was Du ja dankenderweise gemacht hast...).
>>> Vereinfacht also war die Frage: Kann man die Abfrage:
>>> SELECT woche, wert from tbl1 UNION
>>> SELECT woche, wert from tbl2 UNION
>>> SELECT woche, wert from tbl3;
>>> (geht doch... ;-)) )
>>> direkt in der UNION Abfrage auf Woche gruppieren und den Wert pro
>>> Woche summieren. Es gibt keinen anderen Grund dafür, als die Anzahl
>>> der Abfragen zu vermindern.
>> warum es nicht unbedingt von Vorteil ist, alles in eine Abfrage zu
>> packen hast Du ja schon gelesen.
>> Bleibt noch zu erwähnen, dass in einer UNION-Abfrage standardmäßig die
>> Dubletten ausgeblendet werden. Dieses kannst Du umgehen, wenn Du statt
>> "UNION" lieber "UNION ALL" schreibst. Dann beleiben auf jeden Fall alle
>> Datensätze erhalten.
>

> Thomas@ Die gleich strukturierten Tabellen sind aus verschiedenen
> Datenbanken gelinkt.
>
> Wollte das nur noch gesagt haben.

nimm mal folgendes Beispiel:

Tabelle 1:
Woche Wert
39 5
40 6
41 7

Tabelle 2:
Woche Wert
38 4
40 6
41 8

Mit der folgenden Abfrage

SELECT Woche , Wert From Tabelle1
UNION
SELECT Woche , Wert From Tabelle2

erhältst Du folgende Ergebnismenge:

Woche Wert
38 4
39 5
40 6
41 7
41 8


Der Datensatz mit dem Inhalt Woche = 40 und Wert = 6 kommt in beiden
Tabellen vor, wird in der Abfrage aber nur einmal angezeigt. Dabei ist
es unerheblich, ob die beiden Datensätze aus unterschiedlichen Tabellen
oder gar unterschiedlichen Datenbanken stammen.

Wenn Du diese Werte jetzt summierst erhältst Du für die Woche "40" den
Wert "6".

Abhilfe schafft hier da Schlüsselwort ALL:

SELECT Woche , Wert From Tabelle1
UNION ALL
SELECT Woche , Wert From Tabelle2


Die Ergebnismenge sieht wie folgt aus:

Woche Wert
38 4
39 5
40 6
40 6
41 7
41 8


Wenn Du diese Werte jetzt summierst erhältst Du für die Woche "40" den
Wert "12".

Ich hoffe, es ist jetzt deutlicher geworden, warum ich die Verwendung
von UNION ALL empfehle.

0 new messages