SQL Как бы я сгруппировал записи на основе условий? - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь найти клиентов, у которых есть как минимум 4 аккаунта, хотя бы с 1 аккаунтом, который был открыт за последние 6 месяцев.

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

SELECT CustomerID
       ,COUNT(AccountID) as 'Total Accounts'
FROM Customer
GROUP BY CustomerID
HAVING COUNT(AccountID) >= 3`

Вот мои таблицы:

Customer

и

Accounts

А вот что мой конечный результат должен выглядеть так.пока у меня есть CustomerID и Total Accounts.

CustomerID | Total Accounts | New Accounts |
-----------+----------------+------------- +
    Ben    |       3        |      1       | 

РЕДАКТИРОВАТЬ: Программа, в которую я буду импортировать этот запрос, не допускает операторов case.

Ответы [ 4 ]

0 голосов
/ 21 декабря 2018

Вы можете оставить присоединиться к новым учетным записям.Включите фильтр для startdate в условие соединения.Для учетных записей, которые не удовлетворяют этому условию, ни одна запись из account не присоединяется.Таким образом, идентификатор учетной записи для них является нулевым и не будет учитываться.

SELECT c.customerid,
       count(c.accountid) "Total Accounts",
       count(a.accountid) "New Accounts"
       FROM customer c
            LEFT JOIN account a
                      ON a.accountid = c.accountid
                         AND a.startdate >= dateadd(month, -6, getdate())
       GROUP BY c.customerid
       HAVING count(c.accountid) >= 4
              AND count(a.accountid) >= 1;
0 голосов
/ 20 декабря 2018

Count, как и большинство агрегатных функций, игнорирует null с.Я бы использовал это свойство, объединив две таблицы и используя выражение case для возврата только новых учетных записей:

SELECT   CustomerId, 
         COUNT(*) AS TotalAccounts,
         COUNT(CASE WHEN DATEDIFF(MONTH, StartDate, GETDATE()) <= 6 THEN 1 END) 
           AS NewAccounts
FROM     Customer c
JOIN     Accounts a ON c.AccountId = a.AccountId
GROUP BY CustomerId
HAVING   COUNT(*) >= 4 AND
         COUNT(CASE WHEN DATEDIFF(MONTH, StartDate, GETDATE()) <= 6 THEN 1 END) > 0
0 голосов
/ 21 декабря 2018

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

Для вашей заявленной цели - найти клиентов по крайней мере с 4 учетными записями и по крайней мере с 1 учетной записью, котораябыл открыт в последние 6 месяцев, вам все равно не нужно считать последние счета.Достаточно открыть последнюю дату счета и посмотреть, было ли это за последние 6 месяцев.

SELECT c.CustomerId
FROM   Customer c
       JOIN Accounts a
         ON c.AccountId = a.AccountId
GROUP  BY c.CustomerId
HAVING COUNT(*) >= 4
       AND MAX(a.StartDate) >= DATEADD(MONTH, -6, GETDATE()) 
0 голосов
/ 20 декабря 2018

Этот запрос даст вам общее количество учетных записей и число, которое является новым.

SELECT C.CustomerID,
       COUNT(C.AccountID) as Total_Acc,
       SUM(CASE WHEN DATEADD(MONTH,-6,GETDATE()) <= A.StarDate) THEN 1 ELSE 0 END) as New_Acct
FROM Customer C
LEFT JOIN Account A ON C.AccountID = A.AccountID
GROUP BY CustomerID

Затем вы можете использовать это в подзапросе, чтобы найти то, что вы хотите

например

SELECT * 
FROM (
  SELECT C.CustomerID,
       COUNT(C.AccountID) as Total_Acc,
       SUM(CASE WHEN DATEADD(MONTH,-6,GETDATE()) <= A.StarDate) THEN 1 ELSE 0 END) as New_Acct
  FROM Customer C
  LEFT JOIN Account A ON C.AccountID = A.AccountID
  GROUP BY CustomerID
) SUB
WHERE Total_Acc >= 4 and New_Acct >= 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...