-
SQL - Gruppenwechsel-Herausforderung (geht das überhaupt??)
Hallo zusammen,
ich bin neu hier, daher vorweg erstmal ein herzliches HALLO in die Runde!
Leider bin ich grade schwer am verzweifeln mit GROUP BY-Funktionen.
Habe schon einiges nachgelesen und zig Versuche gemacht, bekomme meinen Wunsch jedoch nicht gebacken... :-(
Problemstellung:
Ich habe eine Tabelle mit einer über mehrere Spalten aufgeteilten Artikel-Nr. In dieser Tabelle muss ich die über mehrere Mengen-Felder aufgeteilte Menge je Teil-Artikel-Nr. aufsummieren.
Geht das überhaupt?
Ausgangstabelle:
ARTNR_TEIL1
|
ARTNR_TEIL2 |
ARTNR_TEIL3 |
ANZ_GROESSE_1 |
ANZ_GROESSE_2 |
ANZ_GROESSE_3 |
ANZ_GROESSE_4 |
ANZ_GROESSE_5 |
ANZ_GROESSE_6 |
1 |
002 |
05 |
0 |
1 |
1 |
2 |
4 |
2 |
1 |
002 |
06 |
1 |
2 |
0 |
0 |
2 |
1 |
1 |
003 |
02 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
004 |
08 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
004 |
11 |
1 |
3 |
0 |
0 |
0 |
0 |
2 |
120 |
07 |
1 |
1 |
0 |
0 |
0 |
0 |
2 |
120 |
15 |
2 |
0 |
0 |
0 |
0 |
0 |
3 |
120 |
13 |
0 |
1 |
1 |
1 |
1 |
1 |
3 |
044 |
13 |
1 |
1 |
4 |
1 |
1 |
1 |
Mein gewünschtes Ergebnis sähe für die o.g. Daten so aus:
ARTNR_TEIL1
|
ARTNR_TEIL2 |
ARTNR_TEIL3 |
ANZ_GROESSE_1 |
ANZ_GROESSE_2 |
ANZ_GROESSE_3 |
ANZ_GROESSE_4
|
ANZ_GROESSE_5 |
ANZ_GROESSE_6 |
1 |
002 |
05 |
0 |
1 |
1 |
2 |
4 |
2 |
1 |
002 |
06 |
1 |
2 |
0 |
0 |
2 |
1 |
1
|
002 |
NULL |
1 |
3 |
1 |
2 |
6 |
3 |
1 |
003 |
02 |
0 |
0 |
1 |
0 |
0 |
0 |
1
|
003 |
NULL |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
004 |
08 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
004 |
11 |
1 |
3 |
0 |
0 |
0 |
0 |
1
|
004 |
NULL |
1 |
4 |
2 |
0 |
0 |
1 |
1
|
NULL |
NULL |
2 |
7 |
4 |
2 |
6 |
4 |
2 |
120 |
07 |
1 |
1 |
0 |
0 |
0 |
0 |
2 |
120 |
15 |
2 |
0 |
0 |
0 |
0 |
0 |
2 |
120 |
13 |
0 |
1 |
1 |
1 |
1 |
1 |
2
|
120 |
NULL |
3 |
2 |
1 |
1 |
1 |
1 |
2
|
NULL |
NULL |
3 |
2 |
1 |
1
|
1 |
1 |
3 |
044 |
13 |
1 |
1 |
4 |
1 |
1 |
1 |
3
|
44 |
NULL |
1 |
1 |
4 |
1 |
1 |
1 |
3
|
NULL |
NULL |
1 |
1 |
4 |
1 |
1 |
1 |
NULL
|
NULL |
NULL |
6 |
10 |
9 |
4 |
8 |
6 |
(-> die gewünschten Summenzeilen habe ich der Lesbarkeit halber farbig markiert.)
Vielen Dank schonmal im Voraus für eure Hilfe!!
-
Mit Group by bekommst du das nicht hin.
Dies ist eine typische CUBE-Anforderung, bei der über mehrere Gruppenstufen aggregiert wird.
Beispiele findest du in der SQL-Reference (als PDF-Download verfügbar).
Ist leider aber erst ab V6R1 verfügbar.
-
hallo und Willkommen,
eigendlich doch nur
select teil1, teil2 , sum(gr1), sum(gr2), sum(gr3) from datei group by teil1, teil2
Oder Wie ?
oder als summentabelle
with a as (
select teil1, teil2, 9999 , sum(gr1), sum(gr2), sum(gr3) from datei group by teil1, teil2)
select alle felder from datei union all select alle felder from a order by 1, 2, 3
Robi
@Birgitta
ja gas geht auch mit with rollup oder so.
Aber ich kanns mir immer nicht merken
Das Notwendige steht über dem technisch machbaren.
(klingt komisch, funktioniert aber!)
-
und die 1. summenstuffe noch dazu:
PHP-Code:
with a as (
select teil1, teil2, 9999 , sum(gr1), sum(gr2), sum(gr3)
from datei
group by teil1, teil2
),
b as (
select teil1, 9999, 9999 , sum(gr1), sum(gr2), sum(gr3)
from datei
group by teil1
)
select alle felder
from datei union all select alle felder
from a union all select alle felder
from b
order by 1, 2, 3
Das Notwendige steht über dem technisch machbaren.
(klingt komisch, funktioniert aber!)
-
Das müßte mit Query/400 (WRKQRY/RUNQRY) einfach machbar sein oder auch mit QM-Query (STRQM/STRQMQRY). Oder vielleicht auch als SQL mit einzelnen SELECTs je Gruppenwechselstufe, und alle inklusive der Datei selbst verbunden durch UNION ALL.
-
Mit einfachen SQL's scheitert man ggf. an der Sortierfolge, da spätestens auf der nächst höheren Ebene und am Schluss Gruppenschlüssel NULL sind und die werden nach vorne sortiert.
Um einen Order by kommt man da wohl nicht herum.
Hier das Handbuch-Beispiel:
Code:
The following query:
SELECT
SALES_DATE, SALES_PERSON,
SUM
(SALES) AS UNITS_SOLD,
GROUPING
(SALES_DATE) AS DATE_GROUP,
GROUPING
(SALES_PERSON) AS SALES_GROUP
FROM
SALES
GROUP BY CUBE
( SALES_DATE, SALES_PERSON)
ORDER BY
SALES_DATE, SALES_PERSON
Results in:
SALES_DATE SALES_PERSON UNITS_SOLD DATE_GROUP SALES_GROUP
---------- ------------ ---------- ---------- -----------
12/31/1995 GOUNOT 1 0 0
12/31/1995 LEE 6 0 0
12/31/1995 LUCCHESSI 1 0 0
12/31/1995 - 8 0 1
03/29/1996 GOUNOT 11 0 0
03/29/1996 LEE 12 0 0
03/29/1996 LUCCHESSI 4 0 0
03/29/1996 - 27 0 1
03/30/1996 GOUNOT 21 0 0
03/30/1996 LEE 21 0 0
03/30/1996 LUCCHESSI 4 0 0
03/30/1996 - 46 0 1
03/31/1996 GOUNOT 3 0 0
03/31/1996 LEE 27 0 0
03/31/1996 LUCCHESSI 1 0 0
03/31/1996 - 31 0 1
04/01/1996 GOUNOT 14 0 0
04/01/1996 LEE 25 0 0
04/01/1996 LUCCHESSI 4 0 0
04/01/1996 - 43 0 1
- GOUNOT 50 1 0
-
Hallo zusammen und vielen Dank für die vielen Antworten!
ich habe ich zwischenzeitlich noch weiter mit dem Thema auseinander gesetzt und meine Lösung in den GROUPING SETS gefunden.
Hier die Lösung umgesetzt auf meine o.g. Beispiel-Situation:
Code:
select ARTNR_TEIL1, ARTNR_TEIL2, ARTNR_TEIL3,
sum(ANZ_GROESSE_1), sum(ANZ_GROESSE_2), sum(ANZ_GROESSE_3),
sum(ANZ_GROESSE_4), sum(ANZ_GROESSE_5), sum(ANZ_GROESSE_6)
FROM tabelle
Group by Grouping Sets((ARTNR_TEIL1, ARTNR_TEIL2, ARTNR_TEIL3),
(ARTNR_TEIL1, ARTNR_TEIL2)
(ARTNR_TEIL1)
() );
Besten Dank allerseits!
-
Ich würde es mal mit ROLLUP probieren...
SELECT CASE WHEN (GROUPING(ARTNR_TEIL1) = 1) THEN 'Summe ART 1'
ELSE ISNULL(ARTNR_TEIL1, 'UNKNOWN')
END AS Art1,
CASE WHEN (GROUPING(ARTNR_TEIL2) = 1) THEN 'Summe ART 2'
ELSE ISNULL(ARTNR_TEIL2, 'UNKNOWN')
END AS Art2,
CASE WHEN (GROUPING(ARTNR_TEIL3) = 1) THEN 'Summe ART 3'
ELSE ISNULL(ARTNR_TEIL3, 'UNKNOWN')
END AS Art3,
SUM(ANZ_GROESSE_1) AS Sum1,
SUM(ANZ_GROESSE_2) AS Sum2,
SUM(ANZ_GROESSE_3) AS Sum3,
FROM TABLE
GROUP BY ARTNR_TEIL1, ARTNR_TEIL2, ARTNR_TEIL3 WITH ROLLUP
-
Group by Cube scheint mir das selbe Ergebnis zu bringen.
-
Das ist kein CUBE, da dieser alle möglichen Summen-Kombinationen bildet, sondern ein ROLLUP.
Mit Grouping Set geht das natürlich auch, ist aber etwas komplizierter.
Code:
Select ArtNr_Teil1, ArtNr_Teil2, ArtNr_Teil3,
sum(Anz_Groesse1),
sum(Anz_Groesse2),
sum(Anz_Groesse3),
sum(Anz_Groesse4),
sum(Anz_Groesse5),
sum(Anz_Groesse6)
From ArtTable
Group By Rollup(ArtNr_Teil1, ArtNr_Teil2, ArtNr_Teil3)
Order By ArtNr_Teil1, ArtNr_Teil2, ArtNr_Teil3;
Birgitta
Geht allerdings erst seit Release 6.1
Birgitta
Similar Threads
-
By DEVJO in forum NEWSboard Programmierung
Antworten: 6
Letzter Beitrag: 06-05-15, 11:17
-
By malzusrex in forum IBM i Hauptforum
Antworten: 4
Letzter Beitrag: 01-09-14, 21:48
-
By psd-400 in forum NEWSboard Server Job
Antworten: 0
Letzter Beitrag: 29-11-13, 11:44
-
By RPG-Programmierer in forum NEWSboard Server Job
Antworten: 0
Letzter Beitrag: 13-11-13, 19:27
-
By UGildehaus in forum IBM i Hauptforum
Antworten: 2
Letzter Beitrag: 04-01-03, 18:48
Tags for this Thread
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks