【问题标题】:How to get count and sum of records in SQL Server 2014?如何获取 SQL Server 2014 中记录的计数和总和?
【发布时间】:2018-04-05 18:57:24
【问题描述】:

我有一个包含以下字段的表:

  1. 帐号
  2. 当前余额
  3. 状态ID
  4. 上次交易

StatusID 可以是 1、2 或 11。

我想显示状态 1、2 和 11 中的 AccountNumbers 计数以及每个状态中所有帐户的 CurrentBalance 总和,并且 LastTransaction 超过 6 个月。

到目前为止我的代码:

SELECT Count(AccountNumber) NoOfAccts
      ,SUM(CurrentBalance) TotalBalance          
      ,StatusId

FROM Accounts
WHERE DATEDIFF (DAY, LastTransaction, GETDATE()) > 180
GROUP BY AccountNumber, StatusId

此代码为每个帐户提供了单独的行

|NoOfAccounts | TotalBalance | StatusId|
-----------------------------------------
|           1 |       364.24 |        1|
-----------------------------------------
|           1 |       856.25 |        2|
-----------------------------------------
|           1 |       189.24 |        1|
-----------------------------------------

等等……

我的示例数据如下:

|AccountsNumbr|CurrentBalance| StatusId| LastTransaction|
---------------------------------------------------------
|      215481 |       364.24 |        1| 2018=01-05     |
---------------------------------------------------------
|      215587 |       856.25 |        2| 2017=05-02     |
---------------------------------------------------------
|      216744 |       189.24 |        1| 2017=03-21     |
---------------------------------------------------------
|      548756 |       693.15 |        1| 2017=08-20     |
---------------------------------------------------------
|      235687 |       547.69 |        1| 2018=03-21     |
---------------------------------------------------------
|      895647 |       786.65 |       11| 2017=02-28     |
---------------------------------------------------------

【问题讨论】:

  • 您愿意发布一些示例数据和预期结果吗?这将帮助您获得答案。
  • 你不应该按AccountNumber分组
  • 那么不要按AccountNumber分组。

标签: sql sql-server count sum


【解决方案1】:

下面这个怎么样。注意分组。您在 Group By 中有 AccountNumber。

--sample data
IF object_id('tempdb..#Accounts') is not null drop table #Accounts
CREATE TABLE #Accounts (AccountNumber INT, CurrentBalance MONEY, StatusID INT, LastTransaction DATE)
INSERT INTO #Accounts (AccountNumber,CurrentBalance,StatusID,LastTransaction) VALUES
(1, 100, 1, DATEADD(MONTH,-3, GETDATE())),
(2, 200, 2, DATEADD(MONTH,-4, GETDATE())),
(3, 50, 11, DATEADD(MONTH,-7, GETDATE())), -- older than 6 months
(4, 300, 1, DATEADD(MONTH,-8, GETDATE())), -- older than 6 months
(5, 10, 2, DATEADD(MONTH,-10, GETDATE())), --older than 6 months 
(6, 20, 11, DATEADD(MONTH,-12, GETDATE())), --older than 6 months 
(7, 5, 1, DATEADD(MONTH,-1, GETDATE())),
(8, 50, 2, DATEADD(MONTH,-2, GETDATE())),
(9, 100, 11, DATEADD(MONTH,-4, GETDATE())),
(10, 400, 1, DATEADD(MONTH,-11, GETDATE())) --older than 6 months

--query
SELECT  StatusID,
        COUNT(AccountNumber) AS 'Accounts',
        SUM(CurrentBalance) AS 'CurrentBalance'
FROM #Accounts
WHERE LastTransaction < DATEADD(Month,-6, GETDATE())
GROUP BY StatusID

输出 - 根据临时表数据,这是正确的

StatusID    Accounts    CurrentBalance
1              2           700.00
2              1           10.00
11             2           70.00

【讨论】:

    【解决方案2】:

    如果您需要 AccountNumber 的计数,您现在应该在同一查询中使用 count 和 group by

    所以你应该使用

    SELECT Count(AccountNumber) NoOfAccts
      ,SUM(CurrentBalance) TotalBalance          
      ,StatusId
    
    FROM Accounts
    WHERE DATEDIFF (DAY, LastTransaction, GETDATE()) > 180
    GROUP BY StatusId
    

    SELECT Count(*) NoOfAccts
      ,SUM(CurrentBalance) TotalBalance          
      ,StatusId
    
    FROM Accounts
    WHERE DATEDIFF (DAY, LastTransaction, GETDATE()) > 180
    GROUP BY StatusId,  AccountNumber
    

    【讨论】:

    • 老实说,我不确定这样做是否能得到 OP 想要的答案。在第二个查询中,如果您按 AccountNumber 分组,COUNT(*) 不会提供帐户总数,
    • @Larnu 在第二个查询中回答的结果应该是每个 statusID 和 accountNumber 非空行的数量.. .. 无论如何问题是 OP 不能在 count 中使用 accountNumber 和在组中由 OP 必须在 .在 count 中使用 accountNumber 但在 group by 中不使用或在 group by 但在 number 中使用。
    猜你喜欢
    • 2019-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    相关资源
    最近更新 更多