Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 获取符合特定条件的分组行的计数_Sql_Sql Server - Fatal编程技术网

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