SQL - группировка по электронной почте и самая последняя дата - PullRequest
1 голос
/ 01 октября 2019

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

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

Помогите мне stackoverflow, ваша единственная надежда.

SELECT 
    AccountTypes.Name AS AccountType, 
    CONVERT(nvarchar, PaymentHistory.DateCreated, 23) AS Prev_Billing_Date,
    PaymentHistory.Amount AS Amount, 
    Users.FirstName AS FName, 
    Users.LastName AS LName, 
    Users.Phone AS Phone, 
    Users.Email AS Email
FROM 
    AccountTypes 
INNER JOIN 
    Accounts 
INNER JOIN 
    AccountStatus ON Accounts.StatusID = AccountStatus.ID 
INNER JOIN 
    PaymentHistory ON Accounts.ID = PaymentHistory.AccountID 
            ON AccountTypes.ID = Accounts.AccountTypeID 
INNER JOIN 
    Users 
INNER JOIN 
    UserAccounts ON Users.ID = UserAccounts.UserID 
            ON Accounts.ID = UserAccounts.AccountID
WHERE 
    (UserAccounts.IsOwner = 1) AND 
    (AccountStatus.Name = 'Paid') AND 
    (Accounts.AccountTypeID = 2 OR 
     Accounts.AccountTypeID = 3 OR 
     Accounts.AccountTypeID = 4 OR 
     Accounts.AccountTypeID = 5)
GROUP BY
    AccountTypes.Name, 
    PaymentHistory.DateCreated,
    PaymentHistory.Amount, 
    Users.FirstName, 
    Users.LastName, 
    Users.Phone, 
    Users.Email
ORDER BY 
    AccountType DESC, Email, Prev_Billing_Date DESC;

1 Ответ

1 голос
/ 01 октября 2019

Вы можете использовать row_number() и partition by для достижения того, что вы хотите. Вам не нужно использовать GROUP BY, потому что вы не используете никаких агрегатных функций.

SELECT t1.* FROM 
    (SELECT 
        AccountTypes.Name AS AccountType, 
        CONVERT(nvarchar, PaymentHistory.DateCreated, 23) AS Prev_Billing_Date,
        PaymentHistory.Amount AS Amount, 
        Users.FirstName AS FName, 
        Users.LastName AS LName, 
        Users.Phone AS Phone, 
        Users.Email AS Email,
        ROW_NUMBER() over (PARTITION BY Users.Email ORDER BY PaymentHistory.DateCreated DESC) as rn
    FROM AccountTypes 
    INNER JOIN Accounts ON AccountTypes.ID = Accounts.AccountTypeID 
    INNER JOIN AccountStatus ON Accounts.StatusID = AccountStatus.ID 
    INNER JOIN PaymentHistory ON Accounts.ID = PaymentHistory.AccountID                     
    INNER JOIN UserAccounts ON Accounts.ID = UserAccounts.AccountID
    INNER JOIN Users ON Users.ID = UserAccounts.UserID      
    WHERE 
        UserAccounts.IsOwner = 1 AND 
        AccountStatus.Name = 'Paid' AND 
        Accounts.AccountTypeID IN (2,3,4,5)
    ) t1
WHERE t1.rn = 1
ORDER BY 
    t1.AccountType DESC, t1.Email, t1.Prev_Billing_Date DESC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...