помогите с получением статистики из БД в SQL - PullRequest
0 голосов
/ 01 июля 2010

Я использую SQL-Server 2005.

У меня есть две таблицы Users и Payments, у которых есть внешний ключ для Users.И у Пользователей, и у Платежей есть столбец с датой (Пользователи задают свое значение при регистрации, а Платежи получают значение при оплате).У пользователей есть столбец с именем isPaymentsRecurring в виде бита, который указывает мне обновить пользователя или нет.Значение 1 по умолчанию = повторяющееся.Платежи имеют столбец paymentSum как tinyint, в который я вставляю значение платежа.(первый платеж равен повторяющемуся)

Мне нужно получить немного статистики об этом для простого линейного графика, сгруппированного по дате.Чтобы разделить отдельные дни, я использую приведенный ниже хак, чтобы получить целый день как один элемент.

Дневной хак

dateadd(dd,datediff(dd,0,date),0)

Что мне нужно, чтобы получить следующие значениявсе должны быть сгруппированы по дневному взлому.

1. Уникальные пользователи в системе за день

2. Пользователи, которые заказали один раз, а затем установили isPaymentRecurring на 0.

3.Sumof paymentSum в день

4. Сколько пользователей получают регулярные платежи в день.Это означает заказы пользователя в день, кроме первого заказа в системе.

Спасибо, у меня есть запросы, которые работают, но они не работают так, как я хочу, поэтому я хочу мнение профессионалов по этому поводу.

1 Ответ

2 голосов
/ 01 июля 2010

Вы можете добавить вычисляемые столбцы к вашим Payments и Users таблицам, которые представляют день, месяц и год платежа или регистрации пользователя:

ALTER TABLE dbo.Payments
   ADD PaymentDay AS DAY(PaymentDate) PERSISTED,
   PaymentMonth AS MONTH(PaymentDate) PERSISTED,
   PaymentYear AS YEAR(PaymentDate) PERSISTED

Теперь эти столбцы дают вам значения INT длядень, месяц и год, и вы можете легко запросить их.Поскольку они сохраняются, их можно даже индексировать!

Теперь вы можете легко группировать свои платежи по следующим столбцам:

SELECT (list of fields), COUNT(*)
FROM dbo.Payments
GROUP BY PaymentYear, PaymentMonth, PaymentDay

или все, что вам нужно сделать.При таком подходе вы также можете легко делать статистику за месяц, например, суммировать все платежи и группировать по месяцам.

Обновление: ОК, поэтому вам нужно понять, каксоздайте эти запросы:

  • Уникальных пользователей в системе за день

    SELECT UserDay, UserMonth, UserYear, COUNT(*) 
    FROM dbo.Users
    GROUP BY UserDay, UserMonth, UserYear
    

    Это будет подсчитывать пользователей и группировать их по дням, месяцам, годам

  • Пользователи, которые заказали один раз, а затем установили isPaymentRecurring на 0.

    SELECT UserDay, UserMonth, UserYear, COUNT(*) 
    FROM dbo.Users
    WHERE isPaymentRecurring = 0
    GROUP BY UserDay, UserMonth, UserYear
    

    Это то, что вы ищете ??Количество пользователей, сгруппированных по дням / месяцам / годам, для которых isPaymentRecurring имеет значение 0?

  • сумма платежаСумма в день

    SELECT PaymentDay, PaymentMonth, PaymentYear, SUM(PaymentSum)
    FROM dbo.Payments
    GROUP BY PaymentDay, PaymentMonth, PaymentYear
    

    Это суммирует столбец PaymentSum и группирует его по дням, месяцам, годам

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

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