Суммирование подзапроса и группы по информации о клиенте - PullRequest
1 голос
/ 12 мая 2009

У меня есть три таблицы что-то вроде следующего:

Customer (CustomerID, AddressState)
Account (AccountID, CustomerID, OpenedDate)
Payment (AccountID, Amount)

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

Я хотел бы получить общую сумму всех платежей по штатам по месяцам и месяцам. Э.Г.

Opened Date| State | Total
--------------------------
2009-01-01 |   CA  | 2,500
2009-01-01 |   GA  | 1,000
2009-01-01 |   NY  |   500
2009-02-01 |   CA  | 1,500
2009-02-01 |   NY  | 2,000

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

Я пробовал что-то вроде:

select
  dateadd (month, datediff(month, 0, a.OpenedDate), 0) as 'Date',
  c.AddressState as 'State',
  (
    select sum(x.Amount)
    from (
      select p.Amount
      from Payment p
      where p.AccountID = a.AccountID
    ) as x
  )
  from Account a
  inner join Customer c on c.CustomerID = a.CustomerID
  where ***
  group by
    dateadd(month, datediff(month, 0, a.OpenedDate), 0),
    c.AddressState

Предложение where включает некоторые общие элементы в таблицу Account. Запрос не будет работать, потому что a.AccountID не включен в статистическую функцию.

Правильно ли я подхожу к этому? Как я могу получить данные, которые мне нужны, чтобы рассчитать, какие клиенты в Штатах платят больше всего?

Ответы [ 3 ]

2 голосов
/ 12 мая 2009

Если вы хотите, чтобы данные группировались по месяцам, вам нужно сгруппировать по месяцам:

SELECT  AddressState, DATEPART(mm, OpenedDate), SUM(Amount)
FROM    Customer c
INNER JOIN Account a  ON a.CustomerID = c.CustomerID
INNER JOIN Payments p ON p.AccountID = a.AccountID
GROUP BY   AddressState, DATEPART(mm, OpenedDate)

Показывает номер месяца (1-12) и общую сумму в каждом штате. Обратите внимание, что этот пример не включает годы: все суммы месяца 1 суммируются независимо от года. Добавьте часть даты (гг, OpenedDate), если хотите.

1 голос
/ 12 мая 2009

Другими словами, я пытаюсь выяснить, какие штаты платят больше всего за каждый месяц

Этот выберет наиболее выгодное состояние для каждого месяца:

SELECT  *
FROM    (
        SELECT  yr, mon, AddressState, amt, ROW_NUMBER() OVER (PARTITION BY yr, mon, addressstate ORDER BY amt DESC) AS rn
        FROM    (
                SELECT  YEAR(OpenedDate) AS yr, MONTH(OpenedDate) AS mon, AddressState, SUM(Amount) AS amt
                FROM    Customer c
                JOIN    Account a
                ON      a.CustomerID = c.CustomerID
                JOIN    Payments p
                ON      p.AccountID = a.AccountID
                GROUP BY
                        YEAR(OpenedDate), MONTH(OpenedDate), AddressState
                )
        ) q
WHERE   rn = 1

Замените последнее условие на ORDER BY yr, mon, amt DESC, чтобы получить список всех состояний, как в вашем наборе результатов:

SELECT  *
FROM    (
        SELECT  yr, mon, AddressState, amt, ROW_NUMBER() OVER (PARTITION BY yr, mon, addressstate ORDER BY amt DESC) AS rn
        FROM    (
                SELECT  YEAR(OpenedDate) AS yr, MONTH(OpenedDate) AS mon, AddressState, SUM(Amount) AS amt
                FROM    Customer c
                JOIN    Account a
                ON      a.CustomerID = c.CustomerID
                JOIN    Payments p
                ON      p.AccountID = a.AccountID
                GROUP BY
                        YEAR(OpenedDate), MONTH(OpenedDate), AddressState
                )
        ) q
ORDER BY
        yr, mon, amt DESC
0 голосов
/ 12 мая 2009
select
    AddressState,
    year(OpenedDate) as Yr,
    month(OpenedDate) as Mnth,
    sum(Payment) as SumPayment
from Customer c
    inner join Account a
        on c.CustomerID=a.CustomerID
    inner join Payment p
        on a.AccountID=p.AccountID
group by AddressState, month(OpenedDate)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...