-
Summe der Einzelsätze einer Gruppe
Moin zusammen,
SQL
select f1, f2, count(*) as anz from datei where ... group by F1, f2 order by f1, f2
zeigt
A B 10
A C 14
Wenn ich das erweiter um
select count(*) over () as summe, f1, f2, count(*) as anz from datei where ... group by F1, f2 order by f1, f2
kommt im oberen Bsp
2 A B 10
2 A C 14
gibt es so ein nettes Count(*) over() auch in einer Form die mir in obigen Bsp
24 A B 10
24 A C 14
also die Summe von 10 + 14 zurück gibt?
NICHT a la "With rollup" als Summe in der Liste sonder wie 'Over()' als summe in der Zeile?
Danke
-
over(partition by f1, f2)
-
Danke, aber das hat leider nicht funktioniert
mit der Anpassung steht in Summe immer eine 1
-
Willst Du folgendes Ergebnis?
F1 F2, Anz, Summe
A B 10 24
A B 14 24
Wenn ja, würde ich das mit einer zusätzlichen Common Table Expression lösen:
Code:
With x as (Select f1, f2, count(*) as anz
from x
Group By F1, F2)
Select F1, f2, Anz, Sum(Anz) Over()
from x;
-
Ja, danke
eine Lösung um an die Zahl zu kommen haben wir.
Ich war nur über die "Count(*) Over()" zeile gestolpert, und habe das ausprobiert.
Hätte ja sein können das es da mehr gibt.
Danke
-
Birgitta ist für ihre komplizieren Lösungen bekannt, aber es geht auch einfacher und vor allem auch schneller, denn CTE's sind keine Zwischentabellen:
Generell gilt:
aggr(x) over(partition by ...)
Also:
select f1, f2
, count(*) over(partition by f1, f2) Anzahl
, count(*) over() Summe
Denn Summe von Anzahl = Count über alles.
Ebenso lässt sich errechnen:
,sum(wert) over() Summe
,sum(wert) over(partition by F1, F2) SummeGruppe
,sum(wert) over(partition by F1, F2) * 100 / sum(wert) over() ProzentAnteil
usw. usf.
Einfacher ist es mit einer derived Table:
select a.*, Anzahl*100/Summe ProzentAnteil from (
select f1, f2
, count(*) over(partition by f1, f2) Anzahl
, count(*) over() Summe
from mytable
) a
https://www.ibm.com/docs/en/i/7.4.0?...specifications
-
Birgitta ist für ihre komplizieren Lösungen bekannt, aber es geht auch einfacher und vor allem auch schneller, denn CTE's sind keine Zwischentabellen:
Baldur, bevor Du behauptest ich würde komplizierte Lösungen liefern.
Probier zunächst mal Deine Lösungen aus! Bei keiner der Lösungen, die du bietest erhälst Du die gewünschten 24!
Code:
Select F1, f2, Count(*) Count0,
Count(*) over(partition By F1, F2) Count1,
Count(*) over(Partition by F1) Count2
from x
Group By F1, F2;
Dieses Beispiel liefert:
Code:
F1 F2 Count0 Count1 Count2
A B 10 1 2
A C 14 1 2
Der Count(*) und auch Count(Spalte) ist jeweils ein Count(Distinct, d.h. Duplikate werden NICHT gezählt.
Und wenn Du schon Prozent rechnen willst und Dir meine Lösungen zu kompliziert sind, dann nimm wenigstens den RATIO_TO_REPORT!
Code:
RATIO_TO_REPORT(ColX) OVER(Partition By ColY, ColZ) * 100
Das ist wie beim Äffle und Pferdle:
An der Tafel steht 1*1 -
Äffle schreibt die Lösung = 2 -
Pferdle schüttelt den Kopf -
Äffle korritiert: 1*2 -
Pferdle staunt -
Äffle sagt: 'G'lernt isch halt g'lernt!'
-
Dies ist definitiv falsch:
"Der Count(*) und auch Count(Spalte) ist jeweils ein Count(Distinct, d.h. Duplikate werden NICHT gezählt."
Count(*) zählt alles
Count(Spalte) zählt alles was nicht NULL ist
Count(distinct Spalte) zählt alles was nicht NULL und eindeutig ist.
Dies gilt schon so lange, wie ich SQL mache.
Dies gilt auch für die over()-Funktionen.
Ein "count(*) over(partition by f1, f2) ... group by f1, f2" macht überhaupt keinen Sinn, da das Ergebnis immer 1 ist.
Bei "count(*) over(partition by f1) ... group by f1, f2" ergibt die Zählung die Anzahl der Gruppen F1, allerdings werden dann wieder alle Zeilen ausgegeben.
Ein count(*) over() zählt immer alle Zeilen des Ergebisses.
Die Frage stellt sich nun, was denn genau gezählt werden soll, in der Regel reicht da ein over() ohne einen finalen Group by, da man die Anzahl bestimmter Vorkommen haben will.
Z.B:
select f1, f2
,count(*) over() Gesamtergebniss
,count(*) over(partition by f1) AnzahlGruppenF1
,count(distinct f2) over() AnzahlEindeutigGesamt
from mytable
group by f1, f2
Und was ist gegen eine klassische Prozentrechnung einzuwenden;-)?
Similar Threads
-
By Starocotes in forum NEWSboard Programmierung
Antworten: 3
Letzter Beitrag: 26-08-20, 15:46
-
By Robi in forum NEWSboard Programmierung
Antworten: 2
Letzter Beitrag: 06-04-16, 16:04
-
By DEVJO in forum NEWSboard Programmierung
Antworten: 4
Letzter Beitrag: 01-02-14, 15:22
-
By Bitverdreher in forum IBM i Hauptforum
Antworten: 3
Letzter Beitrag: 05-11-13, 08:39
-
By falke34 in forum NEWSboard Programmierung
Antworten: 3
Letzter Beitrag: 17-02-09, 07:07
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