Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-按电子邮件和最新日期分组_Sql_Date_Email - Fatal编程技术网

SQL-按电子邮件和最新日期分组

SQL-按电子邮件和最新日期分组,sql,date,email,Sql,Date,Email,我有一个SQL查询,应该向我显示每个客户上次支付的款项,但它向我显示所有客户已支付的所有款项。我花了一天的时间在这上面,我要放弃了。我想尝试通过客户电子邮件将我的报告分组,然后从每组客户付款中返回每个组的最新日期。这应该在一份报告中向我显示每个客户最近的付款情况 我正在从多个表中提取信息。理论上,客户可能拥有相同的姓名、号码或支付相同的金额。但这一领域的独特之处在于电子邮件。客户也可以升级他们的帐户,因此客户支付的一组款项可能不都是相同的值。因此,如果我们返回最近的日期,它将显示他们当前的最后一

我有一个SQL查询,应该向我显示每个客户上次支付的款项,但它向我显示所有客户已支付的所有款项。我花了一天的时间在这上面,我要放弃了。我想尝试通过客户电子邮件将我的报告分组,然后从每组客户付款中返回每个组的最新日期。这应该在一份报告中向我显示每个客户最近的付款情况

我正在从多个表中提取信息。理论上,客户可能拥有相同的姓名、号码或支付相同的金额。但这一领域的独特之处在于电子邮件。客户也可以升级他们的帐户,因此客户支付的一组款项可能不都是相同的值。因此,如果我们返回最近的日期,它将显示他们当前的最后一次付款

帮助我,你是我唯一的希望

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;

您可以使用
row\u number()
分区方法来实现所需的功能。您不需要使用
分组依据
,因为您没有使用任何聚合函数

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;

成功了!!!我真的很想学这个。你能解释一下使用“t1”吗?我以前没见过这种方法。我对SQL真的很陌生。几年前我上过it课,所以我记得基础知识。我将研究如何使用行号和分区。非常感谢你尝试一下。现在我终于可以睡觉了。t1只是子查询的一个表别名。您可以查看此链接。