Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Gruppieren über Union (https://www.delphipraxis.net/22561-gruppieren-ueber-union.html)

barnti 19. Mai 2004 10:24


Gruppieren über Union
 
Hallo,

ich habe zwei Select-Statements (mysql), die ich mit 'Union' zusammenfasse. Jedes einzelne Statement ist nach der selben Spalte gruppiert.
SQL-Code:
Select *
From 'Table1'
Join ...
Where ...
Group by 'ID'

union

Select *
From 'Table2'
Join ...
Where ...
Group by 'ID'
Wie schaffe ich es aber die Gruppierung für die ganze Abfrage festzulegen? Denn ich bekomme einen Datensatz doppelt! Beispiel:

SQL-Code:
ID Menge Differenz
--------------------
51    1        1
52    1        1
53    1        1
54    2        2
55    3        3
56    10       10  // Bis hier ist das erste Select-Statement
56    -2       -2  // Diese Zeile liefert mir das zweite
Eigentlich möchte ich den Datensatz mit der ID 56 nur einmal. Für die Differenz muss ich dann das Ergebnis 8 bekommen...

Weiß jemand Rat?

Danke!

Robert_G 19. Mai 2004 10:49

Re: Gruppieren über Union
 
Den Sinn der Gruppierung kapiere ich nicht (bzw. der ganzen Abfrage :gruebel: )....

Code:
[b]SELECT[/b] ID
      ,Menge
      ,Differenz
[b]FROM[/b]  ([b]SELECT[/b] ID
              ,Menge
              ,Menge [b]As[/b] Differenz
        [b]FROM[/b]  Table1
       [b]UNION ALL[/b]
        [b]SELECT[/b] t2.ID
              ,t2.Menge
              ,abs(t1.Menge - t2.Menge) [b]As[/b] Differenz
        [b]FROM[/b]  Table1 t1
              ,Table2 t2
        [b]WHERE[/b] t1.ID(+) = t2.ID [color=#000088]-- kA ob mySQL das schluckt (ich hasse die JOIN Schreibweise :roll: )[/color]
                                 [color=#000088]-- -> wäre wohl ein LEFT OUTER[/color]
       )

barnti 19. Mai 2004 11:03

Re: Gruppieren über Union
 
Hallo,

Zitat:

Zitat von Robert_G
Den Sinn der Gruppierung kapiere ich nicht (bzw. der ganzen Abfrage :gruebel: )....

Musst Du ja auch nicht unbedingt... ;)

Was ich möchte ist die beiden Gruppierungen zu einer zusammenzufassen:
SQL-Code:
SELECT PK.*, sum(PK.differenz)
FROM Partie P
INNER JOIN ...
INNER JOIN ...
INNER JOIN ...
where Differenz>0
Group By PK.Unterpartie_ID

union

SELECT PK.*, sum(differenz)
FROM Position Pos
INNER JOIN ...
INNER JOIN ...
WHERE A.Auftrag_ID<>6 
Group By PK.Unterpartie_ID
Als Ausgabe dann:

SQL-Code:
ID Menge sum(PK.Differenz)
--------------------
51    1    1
52    1    1
53    1    1
54    2    2
55    1    1
56    10   10      // Diese Zeilen sollen Zusammengefasst werden, so dass dort steht:
56   -2    -2      // 56  (beliebig) 8
Mit dem 'Union All' bekomme ich alle Datensätze der Selects. Das bringt daher keine Veränderung...

MrSpock 19. Mai 2004 11:27

Re: Gruppieren über Union
 
Hallo Barnti,

du kannst über Union nicht gruppieren. Da bleibt nur 2 Abfragen zu erstellen und diese dann manuell zusammenzufügen.

barnti 19. Mai 2004 11:56

Re: Gruppieren über Union
 
Zitat:

Zitat von MrSpock
Hallo Barnti,

du kannst über Union nicht gruppieren. Da bleibt nur 2 Abfragen zu erstellen und diese dann manuell zusammenzufügen.

Das ist Sch****!

Danke MrSpock!

shmia 19. Mai 2004 12:41

Re: Gruppieren über Union
 
Zitat:

Zitat von barnti
Was ich möchte ist die beiden Gruppierungen zu einer zusammenzufassen:
SQL-Code:
SELECT PK.*, sum(PK.differenz)
FROM Partie P
INNER JOIN ...
INNER JOIN ...
INNER JOIN ...
where Differenz>0
Group By PK.Unterpartie_ID

union

SELECT PK.*, sum(differenz)
FROM Position Pos
INNER JOIN ...
INNER JOIN ...
WHERE A.Auftrag_ID<>6 
Group By PK.Unterpartie_ID
Mit dem 'Union All' bekomme ich alle Datensätze der Selects. Das bringt daher keine Veränderung...

Mit einer Unterabfrage (also ein Select auf die bisherige Datenmenge) müsste das gehen:
SQL-Code:
SELECT gruppierungsfeld, SUM(summenfeld) FROM
(
SELECT [feldliste]
FROM ...
GROUP BY ...

UNION ALL

SELECT [feldliste]
FROM ...
GROUP BY ...
)
GROUP BY gruppierungsfeld
Es ist zu beachten: in der [Feldliste] dürfen nur Felder auftauchen, die bei GROUP BY aufgeführt
werden (In deinem Fall Unterpartie_ID) und ausserdem dürfen Aggregatfunktionen (SUM, MIN, MAX, COUNT)
verwendet werden.
SELECT * FROM Tabelle GROUP BY Feld1 ist falsch !

barnti 19. Mai 2004 12:46

Re: Gruppieren über Union
 
@shmia: mysql! ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz