SQL-запрос для сводки по экземплярам в день - PullRequest
1 голос
/ 13 марта 2009

У меня есть таблица в базе данных mysql, которая содержит денежные транзакции. Допустим, таблица называется транзакций :

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

Я пытаюсь создать запрос, который возвращает среднюю сумму транзакции, сгруппированную по количеству транзакций, которые появляются в день. Применяемые столбцы - количество и количество созданных.

Поэтому я пытаюсь ответить на вопрос: какова средняя сумма транзакций, которые происходят в дни, когда между 0 и 2 транзакциями, между 2 и 4 транзакциями, между 4 и 6 транзакциями и т. Д.

Есть идеи?

Ответы [ 4 ]

1 голос
/ 13 марта 2009

Вот попытка (но не проверенная):

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;

Это не особенно быстро. Это было бы хорошо для генерации отчета, но если вам нужно, чтобы он выполнялся, например, во время запроса PHP, это не здорово.

1 голос
/ 13 марта 2009
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 голос
/ 13 марта 2009

После нескольких недоразумений я наконец-то, кажется, получаю то, что вам нужно:)

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 голосов
/ 13 марта 2009

Попробуйте что-то вроде

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

Посмотрите еще здесь Функции даты и времени и проверьте функцию МЕЖДУ тоже

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...