In Abfrage Summe berechnen

Hallo!

Ich habe folgendes Problem:
Ich habe eine Tabelle mit verschiedenen, nach einer ID und dem Datum geordneten Ereignissen. Das sieht dann z.B. so aus:

| ID | Datum |Ereignis ID|

| 01 | 01/01/1999 | 01 |
| 01 | 05/10/1999 | 01 |
| 01 | 01/05/2001 | 04 |
| 02 | 01/01/1999 | 02 |
| 02 | 01/12/2002 | 03 |

Meine Abfrage soll nun folgendes Ergebnis liefern:
Ich möchte eine neue Variable erzeugen, die die Summe dieser Ereignisse anzeigt, d.h. wie viele Ereignisse zu diesem Zeitpunkt bereits aufgetreten sind. Ein einfacher sum() oder count() Befehl funktioniert nicht, da die Daten nicht gruppiert werden dürfen. Da die Daten danach mit einem weiteren Programm verarbeitet werden, kommt ein weiteres Problem hinzu: in einigen Jahren trat kein Ereignis auf aber wenn z.B. bei der ID 01 ein Ereignis im Jahr 1999 und eines 2001 aufgetreten ist, geht man davon aus, dass diese ID auch 2000 existiert hat und es müsste automatisch eine Zeile 01/01/2000 und dem Ereignis 0 eingefügt werden.

Das Endergebnis sollte also dann so ausschauen:


|ID| Datum |Ereignis ID| Summe |

|01|01/01/1999| 01 | 0 |
|01|05/10/1999| 01 | 1 |
|01|01/01/2000| 0 | 1 |
|01|01/05/2001| 04 | 2 |
|02|01/01/1999| 02 | 0 |
|02|01/01/2000| 0 | 1 |
|02|01/01/2001| 0 | 1 |
|02|01/12/2002| 03 | 1 |

Gibt es irgend eine Möglickeit, das Problem mit SQL zu lösen?

Vielen, vielen Dank!!!

Sebastian

Hallo,

du könntest über eine Prozedur eine temporäre Tabelle füllen und diese weiterverarbeiten.
Alles, bis auf das Auffüllen mit Daten, an denen es kein Event gegeben hat, ist über eine einfache Gruppierung zu machen.

Eine Gruppierung ändert nichts an den Daten. Sie zeigt nur gruppiert an. Deine Daten bleiben dabei unverändert.

Gruß

Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo!

Vielen Dank! Aber wenn ich die Daten gruppiere bekomme ich doch in der Tabelle ein Ergebnis wie


|ID| Summe |

|01| 2 |
|02| 1 |

Wie kann ich dann die Tabelle mit der anderen so wieder zusammenbringen, dass die Ergebnisse genau in der gewünschten Position stehen und auch die Zwischensummen auftauchen? Also so:


|ID| Datum |Ereignis ID| Summe |

|01|01/01/1999| 01 | 0 |
|01|05/10/1999| 01 | 1 |
|01|01/01/2000| 0 | 1 |
|01|01/05/2001| 04 | 2 |
|02|01/01/1999| 02 | 0 |
|02|01/01/2000| 0 | 1 |
|02|01/01/2001| 0 | 1 |
|02|01/12/2002| 03 | 1 |

Hintergrund ist, dass das Abfrageergebnis in ein anderes Programm exportiert werden soll und dort automatisch weiter verarbeitet wird. Das Programm kann mit den Daten nur etwas anfangen, wenn die Ergebnisse auch an der richtigen Stelle stehen…

Ich hab zwar schon einiges in Access gemacht aber bin bei SQL ziemlicher Anfänger. Aber mit drag and drop „programmieren“ ohne SQL komm ich hier nich weiter…

Viele Grüße und schon mal Danke!

Sebastian

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Man könnte diese Problem mit analytischen Funktionen lösen

select x.*,
sum(*) over (partition by id order by datum) summe
from x;

Ob das bei dir funktioniert hängt von der verwendeten DB ab. Bei Oracle sollte es ab Version 8 funktionieren.

Für das Problem mit den fehlenden Daten würde ich mir eine Jahres Tabelle anlegen, die alle relevanten Jahre enthält, und per outer join mit dieser verjoinen:

select k.jahr, x.*, nvl(ereignis_ID,0)
from kalender k, x
where k.jahr = to_char(x.datum (+), ‚YYYY‘)

cu

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

schau mal, was Jens oben vorgeschlagen hat. mit einer Kalendertabelle, die über einen Outer Join dafür sorgt, dass es mindestens eine Zeile zu jedem Jahr gibt , müsste es klappen. Allerdings hast du dann für jedes Datum aus Kalender ein Ereignis.

Oder:

SELECT id, datum, ereignisid, count(ereignisid)
FROM tab
GROUP BY id, datum, ereignisid
ORDER BY id, datum, ereignisid;

hier fehlen die Datumsangaben OHNE Ereignisse.

In einer Prozedur kannst du jetzt dieses Ergebnis in eine temporäre Tabell abspeichern und im nächsten Schritt die Tabelle durchlesen und die fehlenden Datumsangaben nachtragen.

Gruß

Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]