2017-04-25 1 views
0

Ich versuche, Bericht zu erstellen, der Abonnementpreis (AmountPerMonth) Monat für Monat für 6 Monate für alle Benutzer zeigt - wobei Month1 das Datum der Benutzer ist hat das 1. Abonnementdatum gekauft (NICHT das Registrierungsdatum), und Monat2 usw. sind die folgenden Monate ab diesem Datum, variierend für jedes Konto.
The format of the table for this reportMySQL - Benutzer monatliche Ausgaben in den ersten 6 Monaten des ersten Abonnementkaufs

Ich habe es geschafft, die ersten 2 Monate Tabelle zu ziehen, aber kann nicht herausfinden, wie man bis zum 6. Monat fortfahren kann. Vielen Dank im Voraus!

SELECT F1.Id, F1.Month1, F2.Month2 
FROM 
(SELECT Id, AmountPerMonth AS Month1, ActionDate 
FROM MONTLYSPEND 
GROUP BY ID 
HAVING MIN(ActionDate)) AS F1, 
(SELECT t1.Id R, t2.AmountPerMonth AS Month2, MIN(t2.ActionDate) 
FROM MONTLYSPEND t1 
INNER JOIN MONTLYSPEND t2 
ON t1.Id = t2.Id 
AND t1.ActionDate < t2.ActionDate 
GROUP BY t1.Id) AS F2 
WHERE F1.id = F2.R 
; 
+0

fügen Sie bitte Ihre Tabellenstruktur im Textformat. –

+0

Gibt es Spalten wie 'Monat3',' Monat4' .... 'Monat6' in der Tabelle? Wenn ja, ist es wahrscheinlich, dass das Design nicht [normalisiert] ist (http://www.studytonight.com/dbms/database-normalization.php). –

+0

@JenR - Ich habe ein Bild hochgeladen; DhruvSaxena - das ist richtig. – Lya1981

Antwort

0

Stellt sich heraus, es zwei Möglichkeiten waren - Stored Procedure, die zu viel Speicher braucht, oder unter Verwendung von CASE WHEN, dies auch auf den Tisch schwenkt. Ich hoffe, es ist nützlich für Personen, die Berichte erstellen müssen, die auf der x-Achse Tag für Tag oder Monat für Monat verschiedene Aktivitäten pro Benutzer anzeigen. Die Hauptschwierigkeit, die ich hatte, war die Tatsache, dass Monat_1 (erstes gekauftes Abonnement) ein anderes Datum für jeden Benutzer war. Dieser Bericht kann verwendet werden, um das Verhalten Ihrer Nutzer in den ersten 6 Monaten ihres Abonnements zu analysieren.
Der Bericht von dieser Abfrage generiert sieht wie folgt aus:

+--------+----------+------------------+---------+---------+--------+ 
| UserId | Currency | FirstSubscrPurch | Month_1 | Month_2 | etc... | 
+--------+----------+------------------+---------+---------+--------+ 
| 123 | GBP | 2010-05-27  | 34.00 | 27.00 | 0.00 | 
+--------+----------+------------------+---------+---------+--------+ 

SELECT F6.USERID, F6.Currency, DATE_FORMAT(F6.FirstSubscrPurch, "%Y-%m-%d") AS FirstSubscrPurch, F6.MONTH_1, F6.MONTH_2,F6.MONTH_3, F6.MONTH_4, F6.MONTH_5, F6.MONTH_6, ROUND(((F6.MONTH_1+F6.MONTH_2+F6.MONTH_3+F6.MONTH_4+F6.MONTH_5+F6.MONTH_6)/6),2) AVERAGE, F6.CURRENCY 

FROM (
    SELECT 
     UserId, Currency, FirstSubscrPurch, 
     SUM(CASE WHEN YEAR_AND_MONTH_INDEX = 0 THEN TOTAL_AMOUNT_PAID ELSE 0 END) MONTH_1, 
     SUM(CASE WHEN YEAR_AND_MONTH_INDEX = 1 THEN TOTAL_AMOUNT_PAID ELSE 0 END) MONTH_2, 
     SUM(CASE WHEN YEAR_AND_MONTH_INDEX = 2 THEN TOTAL_AMOUNT_PAID ELSE 0 END) MONTH_3, 
     SUM(CASE WHEN YEAR_AND_MONTH_INDEX = 3 THEN TOTAL_AMOUNT_PAID ELSE 0 END) MONTH_4, 
     SUM(CASE WHEN YEAR_AND_MONTH_INDEX = 4 THEN TOTAL_AMOUNT_PAID ELSE 0 END) MONTH_5, 
     SUM(CASE WHEN YEAR_AND_MONTH_INDEX = 5 THEN TOTAL_AMOUNT_PAID ELSE 0 END) MONTH_6 

     FROM (
      SELECT 
       hp.UserId, hp.Currency, MIN(hp.Date) AS FirstSubscrPurch, 
       CONCAT(YEAR(Date),'-',MONTH(Date)) AS YEAR_AND_MONTH, 
       TIMESTAMPDIFF(MONTH, CONCAT(YEAR(FIRST_PAYMENT_DATE),'-',MONTH(FIRST_PAYMENT_DATE),'-1'), CONCAT(YEAR(Date),'-',MONTH(Date),'-1')) AS YEAR_AND_MONTH_INDEX, -- generates string in format YYYY-M-D 
       MIN(Date) FIRST_PAYMENT_OF_MONTH, 
       MAX(Date) LAST_PAYMENT_OF_MONTH, 
       COUNT(*) NUM_PAYMENTS, 
       SUM(hp.Amount) TOTAL_AMOUNT_PAID, 
       SUM(hp.Credits) Credits 
       FROM payments hp 
       JOIN (
        SELECT UserId, MIN(Date) FIRST_PAYMENT_DATE, ADDDATE(MIN(Date), INTERVAL 6 MONTH) SIX_MONTHS_AFTER_FIRST_PAYMENT 
        FROM payments hp 
        GROUP BY UserId 
        ) USER_MIN_ID ON USER_MIN_ID.UserId = hp.UserId 
        AND hp.Date BETWEEN FIRST_PAYMENT_DATE AND CONCAT(YEAR(SIX_MONTHS_AFTER_FIRST_PAYMENT),'-',MONTH(SIX_MONTHS_AFTER_FIRST_PAYMENT),'-1') 
        GROUP BY UserId, Currency, YEAR_AND_MONTH 
       ORDER BY hp.UserId, hp.Date 
      ) F 
     GROUP BY UserId, Currency 
ORDER BY UserId DESC) F6; 
Verwandte Themen