我在MYSQL中尝试这样的查询
select
Sum(case when WindowsXP = "PASS" then 1 else 0 end) as PASS ,
Sum(case when WindowsVista = "FAIL" then 1 else 0 end) as FAIL
from OS_Table where BuildID = (select distinct BuildID from OS_Table)
group by BuildID
错误是Subquery返回多行。如果我使用IN
代替=
,那么查询将永远进行(几乎在3分钟后它不会停止)
基本上我想要实现的是每个不同的BuildID,当WindowsXP =“PASS”和WindowsVista =“FAIL”时,给我计数通过,失败
我几乎没有10个不同的BuildID
我如何实现这一目标?
答案 0 :(得分:2)
只需删除你的联接,这是多余的:
SELECT buildid,
SUM(CASE WHEN WindowsXP = 'PASS' THEN 1 ELSE 0 END) as PASS ,
SUM(CASE WHEN WindowsVista = 'FAIL' THEN 1 ELSE 0 END) as FAIL
FROM OS_Table
GROUP BY
buildId
这个条件
WHERE BuildID IN (SELECT DISTINCT BuildID FROM OS_Table)
适用于表格中的任何非空buildid
。
<强>更新强>
您的原始查询(使用=
运算符)意味着:“从buildId
等于DISTINCT
的{{1}}值的表格中取出所有记录同一个表,根据buildId
的值将它们分成几组,并计算每个组中表达式的总和“。
buildID
运算符需要双方标量。在=
中,当且仅当它返回一个字段和最多一个记录的记录集时,查询才被视为标量。
您的子查询返回的记录多了一条记录,因此您的原始查询失败(有很多描述性错误)。
使用SQL
运算符,查询意味着“从同一个表格中IN
列表中找到buildId
的表中的所有记录,将它们拆分为根据{{1}}的值计算几个组,并计算每个组中表达式的总和“。
由于buildId
总是在同一个表中的buildID
列表中找到,因此条件是多余的。
答案 1 :(得分:1)
如果您希望输出包含所有BuildID
,则根本不需要WHERE
:
SELECT
BuildID
, SUM(CASE WHEN WindowsXP = "PASS" THEN 1 ELSE 0 END) AS PASS
, SUM(CASE WHEN WindowsVista = "FAIL" THEN 1 ELSE 0 END) AS FAIL
FROM
OS_Table
GROUP BY
BuildID
免责声明:未经测试。