Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.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 server 2008 子查询Jelp中的SQL Server案例计数?_Sql Server 2008_Aggregate Functions_Case - Fatal编程技术网

Sql server 2008 子查询Jelp中的SQL Server案例计数?

Sql server 2008 子查询Jelp中的SQL Server案例计数?,sql-server-2008,aggregate-functions,case,Sql Server 2008,Aggregate Functions,Case,我的表中有许多种statusid。某些值表示表中的工作已“完成” 如果某项内容为“完成”,则分组checkid的所有状态ID值均为 1或10或40。Statusid值不是连续的(有许多Statusid值,这只是一个摘录)。有人能告诉我如何在case子查询中使用In子句吗,或者用一种更简洁的方式来编写 预期结果集 checkid iscomplete 3 0 4 1 5 0 6

我的表中有许多种statusid。某些值表示表中的工作已“完成”

如果某项内容为“完成”,则分组checkid的所有状态ID值均为 1或10或40。Statusid值不是连续的(有许多Statusid值,这只是一个摘录)。有人能告诉我如何在case子查询中使用In子句吗,或者用一种更简洁的方式来编写

预期结果集

    checkid    iscomplete
    3           0
    4           1
    5           0
    6           0
4是完整的,因为只有一行,它有一个“10”。 3不完整,因为其中一个值为“1”,而其他值为“2”。 5不完整,因为它只有“30”个值。 6不完整,因为它有一个“40”,但它也有一个“30”

DML:

错误:

在上下文中指定的非布尔类型的表达式,其中 条件是预期的,在“何处”附近


谢谢。

编写查询以满足要求的一种方法是:

SELECT
    t.checkid,
    CASE 
        WHEN COUNT_BIG(*) = COUNT
            (
            CASE 
                WHEN t.statusid IN (1,10,40)
                THEN 1 
                ELSE NULL 
            END
            ) 
        THEN 1 
        ELSE 0 
    END
FROM #test1 AS t
GROUP BY
    t.checkid
ORDER BY
    t.checkid;
这利用了
COUNT
(表达式)聚合不计算
NULL
(aisde:though
COUNT(*)
will)这一事实。对于所有条目均为状态1、10或40的组,嵌套的
大小写将为该组中的每一行返回1,等于该组的计数(*)。如果组中甚至有一个成员的状态不是1、10或40,则嵌套的
大小写
将返回
NULL
,而
COUNT
不会对其计数

SELECT
    t.checkid,
    CASE 
        WHEN COUNT_BIG(*) = COUNT
            (
            CASE 
                WHEN t.statusid IN (1,10,40)
                THEN 1 
                ELSE NULL 
            END
            ) 
        THEN 1 
        ELSE 0 
    END
FROM #test1 AS t
GROUP BY
    t.checkid
ORDER BY
    t.checkid;