获取按特定条件匹配的行数

时间:2014-10-20 14:01:59

标签: sql sql-server

我有一张桌子,在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

2 个答案:

答案 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

SQL Fiddle

上测试