首页 > 解决方案 > 在 SQL Server 中按 COUNT 子查询分组

问题描述

会喜欢关于如何满足我的需求的建议,如下所述 -

按子查询结果分组,这样一个场景的例子:我有一张表transactionLog,每个事务可以处理多次。我有一个大型统计查询来按尝试计数分析内容,例如 - 按进程计数分组的总交易量。

为了实现上面的示例,我尝试构建的查询是:

SELECT 
    SUM(Amount),
    (SELECT COUNT(*) FROM [db].[dbo].[transactionlog] t2 WHERE t2.OrderGuid = [db].[dbo].[transactionlog].OrderGuid) as 'ProccessCount'
  FROM [db].[dbo].[transactionlog]

  group by 'ProccessCount'

哪个抛出:

每个 GROUP BY 表达式必须至少包含一个不是外部引用的列。

显然我的现实生活场景更广泛,这个例子只是解释我想要实现的目标的一种方式。在现实生活中,我有多个查询,例如针对不同类型的统计信息使用不同的 where 子句,我将所有这些查询合并到一个结果集。似乎工会,一切正常,只是 group by 不起作用。

谢谢!

~~编辑 - 进一步解释我的具体情况~~ 可以说我没有一个名为 OrderGuid 的字段。

TransactionLog是这样建造的——

TransactionLogId (primary key)
Amount
ExtraProcessOfTransactionLogId (default to 0)

每个原始交易的字段都ExtraProcessOfTransactionLogId设置为 0。每次重新处理交易时,都会插入一个新交易,并将其ExtraProcessOfTransactionLogId设置为TransactionLog原始交易。

我想实现同样的目标 - 将按进程尝试计数分组的所有事务的数量相加。

样本数据 -

TransactionLogId:1, Amount:100, ExtraProcessOfTransactionLogId :0
TransactionLogId:2, Amount:100, ExtraProcessOfTransactionLogId :0
TransactionLogId:3, Amount:100, ExtraProcessOfTransactionLogId :1

我想要一个查询,结果是 -

ProcessAttempts : 1, TotalAmount : 100
ProcessAttempts : 2, TotalAmount : 200

非常感谢!

标签: sqlsql-servergroup-bysubquery

解决方案


如果我理解正确,您需要两个级别的聚合:

SELECT ProcessCount, SUM(Amount), COUNT(*)
FROM (SELECT SUM(Amount) as Amount, COUNT(*) as ProcessCount
      FROM [db].[dbo].[transactionlog] tl
      GROUP BY IIF(ExtraProcessOfTransactionLogId = 0, TransactionLogId, ExtraProcessOfTransactionLogId)
     ) og
GROUP BY ProcessCount
ORDER BY ProcessCount;

这首先聚合OrderGuid以获取每个订单的计数和总和。它聚合以获取每个交易数量的订单数量(和数量)。


推荐阅读