Sql 获取符合特定条件的分组行的计数
我有一张桌子,本质上是这样的:Sql 获取符合特定条件的分组行的计数,sql,sql-server,Sql,Sql Server,我有一张桌子,本质上是这样的: ╔═════════╦═══════╦══════╗ ║ Balance ║ Limit ║ Type ║ ╠═════════╬═══════╬══════╣ ║ 6 ║ 2 ║ 1 ║ ║ 3 ║ 3 ║ 2 ║ ║ 2 ║ 5 ║ 2 ║ ╚═════════╩═══════╩══════╝ 现在,我要做的是计算余额,按类型分组,然后返回违规类型的计数。也就是说,如果其总余额不高
╔═════════╦═══════╦══════╗
║ Balance ║ Limit ║ Type ║
╠═════════╬═══════╬══════╣
║ 6 ║ 2 ║ 1 ║
║ 3 ║ 3 ║ 2 ║
║ 2 ║ 5 ║ 2 ║
╚═════════╩═══════╩══════╝
现在,我要做的是计算余额,按类型分组,然后返回违规类型的计数。也就是说,如果其总余额不高于该类型的当前最高限额
在上面的例子中,我们来看一下Limit and Type,它是一个固定的结构:
第1行的余额至少需要为3,第2行和第3行的余额总和至少需要为6
因此,我希望我的查询返回一个1,指示有一种类型的合计余额太低
当然,如果表是空的,我希望返回零
我怎样才能做到这一点?我以前也做过类似的事情,但不必按类型分组。因此,我可以这样做:
SELECT Rowcount = COUNT(IIF (Balance - Limit < 1, 1, NULL)) FROM Table
您首先需要获得每种类型的最大限制:
SELECT Balance,
Limit = MAX(Limit) OVER(PARTITION BY Type),
Type
FROM [Table];
然后,您可以在计数中使用此最大限制,不幸的是,您不能将窗口函数放在计数中,因此您需要使用子查询,然后只对不同类型进行计数:
SELECT [RowCount] = COUNT(DISTINCT Type)
FROM ( SELECT Balance,
Limit = MAX(Limit) OVER(PARTITION BY Type),
Type
FROM [Table]
) AS t
WHERE Balance <= Limit;
或:
此查询可能有助于:
SELECT COUNT(Type) AS types_with_too_low_balances_count
FROM (
SELECT Type
FROM table_name
GROUP BY Type
HAVING SUM(Balance) <= MAX(Limit)
) a
在上测试一下,这几乎就是我想要的。但它似乎并没有增加相同类型行的余额。也就是说,如果我有两行数据:Balance:5,Limit:2,Type:1和Balance:3,Limit:4,Type:1,它将返回1。由于第二行的余额低于第2行的限制,请按不可。在这个例子中,我想比较5+3和4。嗯,这似乎总是返回0。在SQL FIDLE上添加了测试,它会返回1和您的数据
SELECT [RowCount] = COUNT(Type)
FROM ( SELECT Type
FROM [Table]
GROUP BY Type
HAVING SUM(Balance) <= MAX(Limit)
) AS t
SELECT COUNT(Type) AS types_with_too_low_balances_count
FROM (
SELECT Type
FROM table_name
GROUP BY Type
HAVING SUM(Balance) <= MAX(Limit)
) a