2009-03-12 12 views
1

Ich habe eine Tabelle in einer MySQL-Datenbank, die monetäre Transaktionen enthält. Nehmen wir an, den eingereichten Transaktionen genannt wird:SQL-Abfrage für die Zusammenfassung nach Instanzen pro Tag

id int, 
to_user int, 
from_user int, 
created datetime, 
amount double 

eine Abfrage Ich versuche zu schaffen, die die durchschnittliche Menge einer Transaktion durch die Anzahl der Transaktionen gruppiert zurückgibt, die pro Tag angezeigt. Die entsprechenden Spalten sind Betrag und erstellt. Ich versuche, die Frage zu beantworten

Also: was ist die durchschnittliche Anzahl der Transaktionen, die an den Tagen auftreten, wo es zwischen 0 und 2 Transaktionen zwischen 2 und 4 Transaktionen zwischen 4 und 6 Transaktionen usw.

Irgendwelche Ideen?

+0

Sie müssen also die durchschnittliche Anzahl der Transaktionen (wie in „Anzahl der Transaktionen pro Tag“) oder der Durchschnittswert der Spalte AMOUNT? – Quassnoi

+0

Ich brauche den Durchschnitt der Spalte namens AMOUNT. – Dave

Antwort

1
SELECT AVG(`num`), ((`num` - 1) DIV 2) * 2 AS `tier` 
FROM (
    SELECT DATE_FORMAT(`created`, '%Y-%m-%d') AS `day`, COUNT(*) AS `num` 
    FROM `yourtable` 
    GROUP BY 1 
) AS `src` 
GROUP BY `tier` 
1

Nach einigen Missverständnissen scheinen ich, was Sie endlich zu bekommen müssen :)

SELECT cnt_range * 2 AS days_range, 
     CASE WHEN SUM(trans_cnt) > 0 THEN 
      SUM(trans_sum)/SUM(trans_cnt) 
      ELSE 0 
     END AS average_amount 
FROM (
     SELECT SUM(amount) AS trans_sum, 
       COUNT(*) AS trans_cnt, 
       FLOOR(COUNT(*)/2) AS cnt_range 
     FROM transactions 
     GROUP BY 
       TO_DATE(created) 
     ) ao 
GROUP BY 
     cnt_range 
+0

Ich bekomme: "Fehler 1248 (42000): Jede abgeleitete Tabelle muss einen eigenen Alias ​​haben", wenn ich diese Abfrage versuche. Ich verwende: Serverversion: 5.0.32-Debian_7etch6-log – Dave

+0

Entschuldigung, siehe aktualisierten Beitrag. – Quassnoi

1

Hier ist ein Versuch (aber nicht getestet):

SELECT CASE WHEN txn_per_day BETWEEN 0 AND 2 THEN 2 
      WHEN txn_per_day BETWEEN 2 AND 4 THEN 4 
      WHEN txn_per_day BETWEEN 4 AND 6 THEN 6 
      ELSE 8 -- or more 
     END CASE AS num_txns, AVG(t3.amount) 
FROM (
    SELECT t1.*, COUNT(*) AS txn_per_day 
    FROM transactions t1 JOIN transactions t2 
    ON (TO_DAYS(t1.created) = TO_DAYS(t2.created)) 
    GROUP BY t1.id 
) t3 
GROUP BY num_txns; 

Das ist nicht besonders schnell ist. Es wäre in Ordnung, einen Bericht zu erstellen, aber wenn Sie ihn zum Beispiel während einer PHP-Anfrage benötigen, ist das nicht gut.

-1

Probieren Sie etwas wie

SELECT AVG(`amount`) as `amount`, 
    DATE_FORMAT(`created`, '%Y-%m-%d') as `date` 
FROM `transactions` 
GROUP BY DATE_FORMAT(`created`, '%Y-%m-%d') 

einige weitere Schau mal hier bei Date-and-time functions und überprüfen Sie die BETWEEN function zu

+0

Das wird es nicht tun - ich suche nicht nach * spezifischen * Daten, ich suche den durchschnittlichen Betrag von ALLEN Daten, die zwischen X und Y Anzahl von Transaktionen haben. – Dave

Verwandte Themen