我有一张桌子,在essencwe看起来像这样:
╔═════════╦═══════╦══════╗
║ Balance ║ Limit ║ Type ║
╠═════════╬═══════╬══════╣
║ 6 ║ 2 ║ 1 ║
║ 3 ║ 3 ║ 2 ║
║ 2 ║ 5 ║ 2 ║
╚═════════╩═══════╩══════╝
现在,我想要做的是计算余额,按类型分组,然后返回“违规”类型的计数。也就是说,如果它的总余额不高于该类型的最高当前限制。
所以在上面的例子中(看极限和类型,这是一个固定的结构:
第1行中的余额必须至少为3,第2行和第3行中的余额总和必须至少为6.
因此,我希望我的查询返回1(表示有一个类型的总和余额太低)。
当然,如果表是空的,我想要返回零。
我怎样才能做到这一点?我之前做过类似的事情,但不必按类型分组。因此,我可以这样做:
SELECT Rowcount = COUNT(IIF (Balance - Limit < 1, 1, NULL)) FROM Table
答案 0 :(得分:2)
您首先需要获得每种类型的最大限制:
SELECT Balance,
Limit = MAX(Limit) OVER(PARTITION BY Type),
Type
FROM [Table];
然后您可以在计数中使用此最大限制,遗憾的是,您无法将窗口函数放在COUNT
内,因此您需要使用子查询,然后才计算不同的类型:
SELECT [RowCount] = COUNT(DISTINCT Type)
FROM ( SELECT Balance,
Limit = MAX(Limit) OVER(PARTITION BY Type),
Type
FROM [Table]
) AS t
WHERE Balance <= Limit;
您也可以将条件移至WHERE
,因为您没有执行任何其他计数。
修改强>
我可能已经过度复杂了。您可以在子查询中按type
分组以获取最大限制,以及余额的总和,然后计算此子查询的结果:
SELECT [RowCount] = COUNT(Type)
FROM ( SELECT Balance = SUM(Balance),
Limit = MAX(Limit),
Type
FROM [Table]
GROUP BY Type
) AS t
WHERE Balance <= Limit;
或者:
SELECT [RowCount] = COUNT(Type)
FROM ( SELECT Type
FROM [Table]
GROUP BY Type
HAVING SUM(Balance) <= MAX(Limit)
) AS t
答案 1 :(得分:0)
可能是这个查询有帮助:
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
上测试