2009-03-12 7 views
1

J'ai une table dans une base de données mysql qui contient des transactions monétaires. Disons que le Tablé est appelé opérations:Requête SQL pour le résumé par instances par jour

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

Je suis en train de créer une requête qui renvoie le montant moyen d'une transaction groupée par le nombre de transactions qui apparaissent par jour. Les colonnes applicables sont montant et créé. J'essaie donc de répondre à la question suivante: quel est le nombre moyen de transactions effectuées entre 0 et 2 transactions, entre 2 et 4 transactions, entre 4 et 6 transactions, etc.

Des idées?

+0

Vous avez donc besoin du nombre moyen de transactions (comme dans « nombre de transactions par jour »), ou la valeur moyenne de la colonne appelée AMOUNT? – Quassnoi

+0

J'ai besoin de la moyenne de la colonne appelée AMOUNT. – Dave

Répondre

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

Après plusieurs malentendus, je semble enfin obtenir ce dont vous avez besoin :)

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

Je reçois: "ERROR 1248 (42000): Chaque table dérivée doit avoir son propre alias" lorsque j'essaie cette requête. Je suis en cours d'exécution: Version du serveur: 5.0.32-Debian_7etch6-log – Dave

+0

Désolé, voir mise à jour post. – Quassnoi

1

Voici un essai (mais non testé):

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; 

Ce n'est pas particulièrement rapide. Ce serait bien pour générer un rapport, mais si vous avez besoin de le faire pendant une requête PHP par exemple, ce n'est pas génial.

-1

Essayez quelque chose comme

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

Regardez un peu plus ici à Date-and-time functions et vérifier la BETWEEN function trop

+0

Cela ne va pas le faire - je ne cherche pas de dates * spécifiques *, je cherche le montant moyen de TOUTES les dates qui ont entre X et Y nombre de transactions. – Dave

Questions connexes