SQL如何根据条件对记录进行分组?

SQL如何根据条件对记录进行分组?,sql,sql-server,group-by,count,having,Sql,Sql Server,Group By,Count,Having,我正在努力寻找任何客户,至少有4个帐户,至少有1个帐户已在过去6个月内打开 SELECT CustomerID ,COUNT(AccountID) as 'Total Accounts' FROM Customer GROUP BY CustomerID HAVING COUNT(AccountID) >= 3` 到目前为止,我能够得到客户和总帐户,但我不知道如何添加一列,为在过去6个月新开帐户的数量 SELECT CustomerID ,COUNT(Acco

我正在努力寻找任何客户,至少有4个帐户,至少有1个帐户已在过去6个月内打开

SELECT CustomerID
       ,COUNT(AccountID) as 'Total Accounts'
FROM Customer
GROUP BY CustomerID
HAVING COUNT(AccountID) >= 3`
到目前为止,我能够得到客户和总帐户,但我不知道如何添加一列,为在过去6个月新开帐户的数量

SELECT CustomerID
       ,COUNT(AccountID) as 'Total Accounts'
FROM Customer
GROUP BY CustomerID
HAVING COUNT(AccountID) >= 3`
这是我的桌子:

这是我的最终结果。到目前为止,我有CustomerID和Total帐户

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

编辑:我将在其中导入此查询的程序不允许使用case语句。

此查询将为您提供帐户总数和新的数字

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
然后可以在子查询中使用它来查找所需内容

乙二醇

与大多数聚合函数一样,Count忽略空值。我将通过连接两个表并使用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
我将导入此查询的程序不允许使用case 声明

为了实现您的既定目标,即找到拥有至少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()) 

你可以加入新的帐户。在联接条件中包括startdate的筛选器。对于不满足该条件的帐户,不会加入来自帐户的记录。因此,他们的帐户ID为空,不会被计算在内

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;

你真的不需要过去6个月的开户数量,是吗?听起来你只需要上次开户的日期。i、 e.由于nullsI不能使用用例语句,一些平台将发出警告。有没有办法不用它就能做到这一点?@user10301497为什么你不能?@Mureinik出于某种原因,我将查询导入的程序不允许使用case语句。@Mureinik我还认为我需要一个子查询,因为TotalAccounts和NewAccounts在你的查询中都有4个。我需要总共3个帐户和1个新帐户。我不能使用用例语句。有没有办法不用它就可以做到这一点?@user10301497为什么不能使用case语句?@user10301497可以,但它的运行时间是它的两倍或三倍。我导入查询的程序出于某种原因不允许使用case语句。那是什么程序@user10301497