DB2: Wie Werte zu einer Gruppe zusammenfassen

CurlyConny

Mitglied
Hallo!

Ich habe eine Tabelle mit Projekten und verschiedene Arbeitsschritte, deren Dauer ich grafisch anzeigen lassen will, d.h. für Projekt XY entfallen 10 % der Zeit auf Arbeitsschritt 1, 23 % auf Arbeitssschritt 2 usw.
Da ich aber seeeehr viele Arbeitsschritte habe, würde ich gerne nur die 5 größten anzeigen lassen und die restlichen zu "Others" zusammenfassen.

Mein bisheriger Code sieht so aus:

SELECT DISTINCT a.actdesc AS name, SUM(days(e.emendate) - days(e.emstdate)) AS dauer
FROM empprojact e, act a, project p
WHERE e.actno = a.actno AND e.projno=p.projno AND (p.projname = '#ProjectTree#' OR 'TOTAL' = '#ProjectTree#')
GROUP BY a.actdesc
ORDER BY 1 ASC

Wie muss ich ihn anpassen, damit obiges Problem gelöst wird.

Danke und Grüße
Conny
 
Moin CurlyConny,

ist ein bisschen missverständlich formuliert.
Willst Du "die 5 größten Arbeitsschritte" je Projekt (Bsp e.projnr=4711) + den Rest der Arbeitsschritte der projnr 4711als "Other" ermitteln?
Ich frage nur, weil Du ja bisher nur alphabetisch nach a.actdesc (?Arbeitsschritt-Beschreibung?) gruppierst/sortierst und weder noch Projekten noch nach Dauer anordnest...
Und wieso "Distinct(a.actdesc)"? *nicht verstanden*

Soll denn zuerst Projekt 4711 erscheinen mit den 5 größten Einzelarbeitsschritten + als 6tes "Projekt 4711 / Other" und danach Projekt 4712, 4713 etc?
Oder wie ist es gemeint?

Grüße
Biber
 
Zuletzt bearbeitet:
hallo!

also, ich dachte mir, dass ich die 5 arbeitsschritte mit der längsten dauer anzeige, die restlichen arbeitsschritte werden unter "others" zusammengefasst. das ist erstmal alles unabhägig vom projekt...

lg
conny
 
Moin CurlyConny,

das erforderliche Statement könnte allerdings ein wenig wenig unappetitlci aussehen - ich würde für dieses Konstrukt eher zu einer kleinen STP und einer ebenso handlichen Global Tempory Table raten, damit der ganze Quark auf dem Server läuft und nicht Dein Client jedesmal in einen Timeout rennt.

Anyhow, Mimik wäre dann mit einem Client-Select so:
* das Select von oben ergänzt um die Klausel "fetch first 5 rows only"
* und das in UNION mit der Summe aus allen Zeilen, die NICHT in den ersten 5 Zeilen oben enthalten sind.

hört sich shice an und die Performance wird noch schlechter sein.
Lege Dir am besten einen Hilfsview an, sonst ist es zusätzlich auch nicht mehr wartbar...


Code:
 Create View ActDauer ( ActName, Dauer ) as (
SELECT DISTINCT a.actdesc AS name, SUM(days(e.emendate) - days(e.emstdate)) AS dauer
FROM empprojact e, act a, project p
WHERE e.actno = a.actno AND e.projno=p.projno AND (p.projname = '#ProjectTree#' OR 'TOTAL' = '#ProjectTree#')
GROUP BY a.actdesc
)
;

Und dann:
Code:
 select ActName, Dauer from ActDauer
ORDER BY Dauer DESC 
fetch first 5 rows only
UNION 
Select 'Other' , Sum(Dauer) from Actdauer
 where Actname not in (
      select ActName from ( select ActName, Dauer from ActDauer
                                               ORDER BY Dauer desc
                                                 fetch first 5 rows only)
        )

So etwas meinte ich mit unappetitlich und inperformant.
Würde ich auch nicht weiterverfolgen. -->Stored procedure, GTT als Zwischentabelle, ResultSet an den Client, fertig.

Grüße und viel Glück
Biber
 
hallo!

danke für deine hilfe, aber leider hatte ich nicht viel glück...
habe folgendes eingegeben:

Create View ActDauer ( ActName, Dauer ) as (
SELECT DISTINCT a.actdesc AS name, SUM(days(e.emendate) - days(e.emstdate)) AS dauer
FROM empprojact e, act a, project p
WHERE e.actno = a.actno AND e.projno=p.projno AND (p.projname = '#ProjectTree#' OR 'TOTAL' = '#ProjectTree#')
GROUP BY a.actdesc
)


und danach:

SELECT ActName, Dauer
FROM ActDauer
ORDER BY Dauer DESC
FETCH FIRST 5 ROWS ONLY
UNION
SELECT 'Other' , SUM(Dauer)
FROM ActDauer
WHERE ActName NOT IN (
SELECT ActName FROM ( SELECT ActName, Dauer FROM ActDauer
ORDER BY Dauer DESC
FETCH FIRST 5 ROWS ONLY)
)

als fehlermeldung erhalte ich:

SELECT ActName, Dauer FROM ActDauer ORDER BY Dauer DESC FETCH FIRST 5 ROWS ONLY UNION SELECT 'Other' , SUM(Dauer) FROM ActDauer WHERE ActName NOT IN ( SELECT ActName FROM ( SELECT ActName, Dauer FROM ActDauer ORDER BY Dauer DESC FETCH FIRST 5 ROWS ONLY) )
SQL0104N Auf "BEGIN-OF-STATEMENT" folgte das unerwartete Token "SELECT
ActName, Dauer FROM ActDau". Zu den möglichen Token gehören:
"<query_expr_body>". SQLSTATE=42601

SQL0104N Auf "BEGIN-OF-STATEMENT" folgte das unerwartete Token "SELECT ActName, Dauer FROM ActDau". Zu den möglichen Token gehören: "<query_expr_body>".

Erläuterung:

Bei dem Token, das auf "<text>" folgt, wurde ein Syntaxfehler in der
SQL-Anweisung oder der Eingabebefehlszeichenfolge für die Prozedur
SYSPROC.ADMIN_CMD festgestellt. Das Feld "<text>" enthält die 20 Zeichen
der SQL-Anweisung oder der Eingabebefehlszeichenfolge für die Prozedur
SYSPROC.ADMIN_CMD, die dem ungültigen Token unmittelbar vorangehen.

Als Hilfestellung wird im Feld SQLERRM des SQL-Kommunikationsbereichs
(SQLCA) eine Liste möglicher Token "<tokenliste>" angezeigt. Bei der
Zusammenstellung dieser Liste wird davon ausgegangen, dass die Anweisung
bis zum angegebenen Punkt korrekt ist.

Die Anweisung kann nicht verarbeitet werden.

Benutzeraktion:

Überprüfen Sie die Anweisung im Bereich des ungültigen Token, und
korrigieren Sie sie.

sqlcode: -104

sqlstate: 42601


was ist falsch?

wenn ich mir den inhalt von ActDauer anzeigen lasse, dann ist die tabelle leer?

lg
conny
 
Zuletzt bearbeitet:
Zurück