首页 > 解决方案 > 用于从内部连接评估布尔逻辑的 SQL 查询

问题描述

尝试从数据集中确定 PASS/FAIL 结果,其中列中的预期 FLAG 值数量是预先确定的,并且相同行的另一列与特定文本匹配。

如果在 Descript 列中找到的值的数量等于预定的数量,并且每行的 PValue 与文本“PASS”匹配,则结果为文本“PASS”。

如果找到的值的数量不等于预定数量,则无论 PValue 内容如何,​​结果都是文本“FAIL”。

如果找到的值的数量等于预定数量,但一个或多个 PValue 条目不等于“PASS”,则结果文本为“FAIL”。

预期 FLAG 行数 = 3 的示例输入数据:

描述 P值 唯一身份
最后的 1
旗帜 经过 2
掌握 产品 3
旗帜 经过 4
FLb 经过 5
主要的 部长 6
劳里 测验 7
旗帜 经过 8
9

上述数据的预期结果:

数数
经过

否则输出:

数数
失败

到目前为止,这是我的查询:

DECLARE @ExpectedNumFlags AS INT = 3

  select count(*) as 'count'
  FROM
(
SELECT [Descript]
      ,[PValue]
      ,[uniqueID]
  FROM [MyBookLibraryDB].[dbo].[Historian]
  WHERE [Descript] = 'FLAG'
) AS t
INNER JOIN
(
  select count(*) as 'count'
  FROM
  (
    SELECT [Descript]
      ,[PValue]
      ,[uniqueID]
    FROM [MyBookLibraryDB].[dbo].[Historian]
    WHERE [Descript] = 'FLAG'
  ) AS z
 WHERE [PValue] = 'PASS'
 ) AS q
 on q.count = @ExpectedNumFlags -- this doesn't make sense

最后一个 ON 子句只是我四处游荡,试图解决这个问题……并意识到我需要帮助。

请指教。谢谢(在按照 SO 表指导精心格式化数据后,预览显示了漂亮的表,然后帖子看起来像垃圾!)

标签: sqlsql-server

解决方案


如果在 Descript 列中找到的值的数量等于预定的数量,并且每行的 PValue 与文本“PASS”匹配,则结果为文本“PASS”。

如果我理解正确,您只关心FLAG行。并且您想知道是否所有标志行都'PASS'具有预期的数量。如果是这样,这是关于总量的条件逻辑:

select (case when sum(case when pvalue = 'PASS' then 1 else 0 end) = count(*) and
                  count(*) = <predetermined number>
             then 'PASS' else 'FAIL'
        end)
from [MyBookLibraryDB].[dbo].[Historian]
where desript = 'FLAG'

推荐阅读