komplizierte Abfrage

Kalito

Erfahrenes Mitglied
Hallo,

Ich habe eine recht komplexe Abfrage und komme nicht wirklich weiter. In einer Tabelle habe ich alle Spiele eines Kunden und ich brauche aus dieser Tabelle von bestimmten Kunden die Anzahl der Spiele und der generierte Umsatz vor einem Zeitpunkt X, zwischen Zeitpunkt X und Y und nach dem Zeitpunkt Y. AM ende möchte ich folgende Spalten haben:

Code:
| cst_id | gah_group | gah_type | anzahl_vorher | umsatz_vorher | anzahl_between | ............ |
-------------------------------------------------------------------------------------------------
| 1111  | 1                  | 1             | 100                  | 5.000                | 3                         |
| 1111  | 1                  | 2             | 20                    | 2.000                | null                     |
| 1111  | 7                  | 7             | null                  | null                   | 3                         |
| 2222  | 1                  | 1             | null                  | null                   | 3                         |

Bis Umsatz_vorher habe ich auch keine Probleme:
Meine bisherige Abfrage:

Code:
SELECT
  bnc_cst_id,
  gah_group,
  gah_type, 
  Umsatz_vorher,
  Anzahl_vorher
  FROM
  (
  SELECT bnc_cst_id, pro_valid_from
  FROM Bonuscards
  INNER JOIN Promotions ON (pro_id = bnc_pro_id)
  WHERE
  bnc_cst_id is not null
  AND
  pro_id = 84
  ) as bonuscard_customer //Selektierung Kunden
  LEFT JOIN
  (
  SELECT gah_cst_id, gah_type, gah_group, SUM(gar_amount) as Umsatz_vorher, COUNT(gah_gam_id) as Anzahl_vorher
  FROM gamereceipts
  INNER JOIN games ON (gam_id = gar_gam_id)
  INNER Join games_history ON (gah_gam_id = gar_gam_id)
  WHERE
  gah_state IN (1,6,9) //Spiele, die teilnehmend, abgeschlossen oder archiviert sind
  AND
  gam_played < '2015-05-06 06:35:00'
  GROUP BY
  gah_cst_id, gah_type, gah_group
  ) as game_vorher
  ON (game_vorher.gah_cst_id = bonuscard_customer.bnc_cst_id)
   
  ORDER BY
  bnc_cst_id

eigentlich wollte ich mit einem weiteren LEFT JOIN Anzahl und Umsatz für den Between-Bereich ranhängen, was aber leider nicht so klappte. Gibt es vielleicht eine einfachere Möglichkeit?

Gruß, Pat
 
In welcher Form liegen die Daten vor?
Ich sehe ein gewünschtes Resultat und ein unformatiertes SQL (und damit leider so gut wie unlesbar).

Zeig doch mal wie die Quelle aussieht.

Dann wäre es auch gut zu wissen, mit was für einer DBMS du arbeitest. Ist es MySQL, Oracle, SQL Server oder noch etwas anderes?
 
Hallo,

das ganze läuft auf einer IBM DB2-Datenbank.

Über die Abfrage
SQL:
SELECT bnc_cst_id FROM Bonuscards WHERE  bnc_cst_id is not null AND bnc_pro_id = 84
bekomme ich alle Spieler, die an der Aktion teilgenommen und Ihren Gutscheincode eingelöst haben.

Jetzt habe ich folgende Tabellen:
GAME:
Code:
| GAM_ID | GAM_PLAYED |
| 10000000 | 27.01.10 08:09 |
| 10000001 | 27.01.10 08:10 |
| 10000020 | 01.02.11 09:47 |
| 10000021 | 03.02.11 09:47 |
| 10000022 | 03.02.11 13:21 |
| 10000023 | 04.02.12 13:35 |
| 10000024 | 04.02.13 13:35 |
| 10000025 | 04.02.14 13:37 |
| 10000026 | 04.02.14 13:38 |
| 10000040 | 04.02.15 16:49 |

Diese Tabelle gibt mir die Auskunft, wann das Spiel gespielt wurde

Game_history
Code:
| GAH_CST_ID | GAH_GAM_ID | GAH_STATE | GAH_TYPE | GAH_GROUP |
| 256691 | 10000000 | 1 | 1 | 2 |
| 256692 | 10000001 | 1 | 1 | 2 |
| 256886 | 10000020 | 1 | 7 | 7 |
| 256886 | 10000021 | 1 | 1 | 4 |
| 256887 | 10000022 | 1 | 1 | 1 |
| 256917 | 10000023 | 1 | 1 | 2 |
| 256917 | 10000024 | 1 | 1 | 1 |
| 256918 | 10000025 | 1 | 1 | 2 |
| 256918 | 10000026 | 1 | 1 | 1 |
| 256920 | 10000040 | 1 | 7 | 7 |
In dieser Tabelle wird der Status eines Spieles, sowie dessen Zuordnung zu dem Spieler (gah_cst_id == cst_id) abgebildet und Auskunft über Gruppe und Typ gegebn. GAH_GAM_ID == GAM_ID

gamesreceipts
Code:
| GAR_GAM_ID | GAR_AMOUNT |
| 10000000 | 1.00 |
| 10000001 | 1.00 |
| 10000022 | 3.75 |
| 10000023 | 4.50 |
| 10000024 | 5.25 |
| 10000025 | 4.50 |
| 10000026 | 5.25 |
| 10000042 | 2.50 |
| 10000043 | 2.50 |
| 10000044 | 6.00 |
IN der Gamesreceipts erfahre ich, welech Umsatz der Spielschein gebracht hat. GAR_GAM_ID == GAM_ID


Ich brauche jetzt eine Abfragee, die mir pro Customer die Anzahl der Spiele und den generierte Umsatz je gah_group-gah_type-Kombination vor den 1.1.2011, zwischen 1.1.2011 und 31.12.2013 und nach dem 31.12.2013 in einer Tabelle. Falls es für die Kombination Customer zu Gruppe-Typ für den Zeitraum keinen Wert gibt, kann auch null stehen.

Und wie gesagt. Für einen Zeitraum bekomme ich es auch hin, jedoch brauche ich alle 3 nebeneinander :(
 
Etwa so. Bei den Bträgen habe ich nur den ersten umgesetzt. Die Anderen kannst du selber erweitern.

Ich weiss nicht, ob DB2 den CASE WHEN Befehl kennt. Ich denke aber, dass DB2 was ähnliches hat

SQL:
select 
    count(*) AS CNT,       
    gh.GAH_CST_ID,
    sum(case 
      when g.gam_played < '2011-01-01' 
      then 1
      else 0
    end) as anzahl_vorher,
    sum(case 
      when g.gam_played < '2011-01-01' 
      then gr.gar_amount
      else 0
    end) as betrag_vorher,
    sum(case 
      when g.gam_played between '2011-01-01' and '2013-12-31' 
      then 1
      else 0
    end) as anzahl_between,
    sum(case 
      when g.gam_played > '2013-12-31' 
      then 1
      else 0
    end) as anzahl_nachher
from game_history as gh, game as g, GAMESRECEIPTS as gr
where g.gam_id = gh_gah_gam_id
and g.gam_id = gr.gar_gam_id
group by gh.GAH_CST_ID
 
Wunderbar, es funktioniert. Bin aber erstaunt, wie einfach und in meinen Augen auch elegant diese Abfrage ist. Danke
 
Zurück