Outer Apply und Cross Apply in SQL nutzen – Einleitung
- Outer Apply und Cross Apply in SQL nutzen – Einleitung
- Outer Apply und Cross Apply in SQL nutzen – Die Datenmenge bauen
- Outer Apply und Cross Apply in SQL nutzen – NULL-Werte auffüllen
Ich halte mich schon recht erfahren im Umgang SQL, kürzlich bin ich aber an einer Ecke von SQL vorbeigekommen, die ich auch noch nicht kannte. Dabei handelt es sind um die „OUTER APPLY“ bzw. „CROSS APPLY“ Operatoren.
Um die Lösung herzuleiten betrachten wir zuerst das Problem:
Gegeben seien Kreditverträge mit verschiedenen Zahlplänen. Ein Vertrag zahlt vielleicht monatlich, einer zahlt quartalsweise. Ein Vertrag hat dabei ein Startdatum und ein Enddatum sowie verschiedene Cashflows.
Hier ein paar Testdaten mit den entsprechenden Tabellen, die dazugehörigen SQL-Statements folgen später.
Cashflows
| ContNo | StartDate | EndDate |
|---|---|---|
| 123 | 2025-01-01 | 2025-12-31 |
| 456 | 2024-01-01 | 2024-12-31 |
Cashflows
| ContNo | CashflowDate | Amount |
|---|---|---|
| 123 | 2025-01-05 | 100.0 |
| 123 | 2025-04-07 | 110.0 |
| 123 | 2025-07-06 | 105.0 |
| 123 | 2025-12-16 | 120.0 |
| 456 | 2024-01-05 | 100.0 |
| 456 | 2024-06-12 | 130.0 |
| 456 | 2025-12-22 | 101.0 |
Das Problem ist jetzt, wie kann man eine monatliche Übersicht pro Vertrag bekommen, bei der in den Monaten, wo es kein Cashflow gab, einfach der letzte Cashflow angezeigt wird? Das Endergebnis soll wie folgt aussehen:
| ContNo | CashflowDate | Amount |
|---|---|---|
| 123 | 2025-01-31 | 100,00 |
| 123 | 2025-02-28 | 100,00 |
| 123 | 2025-03-31 | 100,00 |
| 123 | 2025-04-30 | 110,00 |
| 123 | 2025-05-31 | 110,00 |
| 123 | 2025-06-30 | 110,00 |
| 123 | 2025-07-31 | 105,00 |
| 123 | 2025-08-31 | 105,00 |
| 123 | 2025-09-30 | 105,00 |
| 123 | 2025-10-31 | 105,00 |
| 123 | 2025-11-30 | 105,00 |
| 123 | 2025-12-31 | 120,00 |
| 456 | 2024-01-31 | 100,00 |
| 456 | 2024-02-29 | 100,00 |
| 456 | 2024-03-31 | 100,00 |
| 456 | 2024-04-30 | 100,00 |
| 456 | 2024-05-31 | 100,00 |
| 456 | 2024-06-30 | 130,00 |
| 456 | 2024-07-31 | 130,00 |
| 456 | 2024-08-31 | 130,00 |
| 456 | 2024-09-30 | 130,00 |
| 456 | 2024-10-31 | 130,00 |
| 456 | 2024-11-30 | 130,00 |
| 456 | 2024-12-31 | 101,00 |
Im nächsten Teil fangen wir dann mit den SQL Statements an.