Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.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
Mysql 带计数的sql查询_Mysql_Sql - Fatal编程技术网

Mysql 带计数的sql查询

Mysql 带计数的sql查询,mysql,sql,Mysql,Sql,我确信这很容易,但我有一个块,我正试图针对一个已经简化的表编写一些sql(例如) 我是一个查询,将返回每个名称的通过或失败计数 类似于失败 foo, 1 boo, 2 soo, 0 顺便说一句 foo, 3 boo, 1 soo, 1 对于fail select RunName, count(Result) as cnt from your_table where Result = 'fail' group by RunName 这是通过的pass select RunName, coun

我确信这很容易,但我有一个块,我正试图针对一个已经简化的表编写一些sql(例如)

我是一个查询,将返回每个名称的通过或失败计数

类似于失败

foo, 1
boo, 2
soo, 0
顺便说一句

foo, 3
boo, 1
soo, 1

对于
fail

select RunName, count(Result) as cnt
from your_table
where Result = 'fail'
group by RunName
这是通过的
pass

select RunName, count(Result) as cnt
from your_table
where Result = 'pass'
group by RunName

对于所有的失败结果,只需更改pass的
where
子句:

select RunName, count(Result)
from [tableName]
where Result = 'fail'
group by RunName

您需要使用分组方式

像这样的

Select count(result), runname, result from sometable
group by runname, result
这将给您提供如下输出

计数运行名结果

2富通

3 foo失败

尝试以下方法:

通行证:

SELECT RunName, COUNT(*)
FROM TableName
GROUP BY Result
WHERE UPPER(Result) = 'PASS'
如果失败:

SELECT RunName, COUNT(*)
FROM TableName
GROUP BY Result
WHERE UPPER(Result) = 'FAIL'
这是你想要的吗

SELECT  RunName, SUM(CASE WHEN Result = 'pass' THEN 1 ELSE 0 END) as NumPass,
        SUM(CASE WHEN Result = 'fail' THEN 1 ELSE 0 END) as NumFail
FROM   yourtable
GROUP BY RunName
如果您希望每个结果都有单独的结果,则可以对where子句进行筛选,如下所示:

    SELECT  RunName, COUNT(1) as NumPass
    FROM    yourtable
    WHERE   Result = 'pass'
GROUP BY RunName


SELECT  RunName, COUNT(1) as NumFail
FROM    yourtable
WHERE   Result = 'fail'
GROUP BY RunName

通常情况下,您会按RunName进行简单的计数和分组,但是

即使结果为零(在MySQL上),这也应该有效

演示

编辑:正如Aaron指出的,这只适用于MySQL,这也适用于SQL Server

SELECT  RunName, SUM(CASE WHEN Result = 'fail' THEN 1 ELSE 0 END) as fails
FROM   TableA
GROUP BY RunName
演示

Edit2:正如Marcus指出的,这可能不是一种索引友好的查询方式,因此如果您有主键,那么最好使用计数/组进行自连接,以获得正确的结果

SELECT a.RunName, COUNT(b.Result)
FROM TableA a LEFT JOIN TableA b ON a.id=b.id AND b.Result='fail'
GROUP BY RunName

演示。

您需要修改您的问题,不清楚您想知道什么您使用的是MySQL还是SQL Server?请不要用两种不同风格的RDBMS来标记问题。很抱歉,这是mysql,但我们也使用sql server来存储类似的结果,所以我将其添加为两者。MySql可以满足我的需要,但这仍然不是SQL Server的问题。这在MySql中也可以,但SQL Server不支持布尔表达式。我意识到这个问题被标记为两个,所以不清楚。@AaronBertrand啊,只看到了MySQL部分,我将对这两个部分进行修改。当你在几分钟内得到6个答案时,你知道这是一个愚蠢的问题:)这和其他一些问题一样有效。感谢Stag for SQL Server is
SQL Server
SQL
用于通用SQL。@Marcusadam标记已更改,请参阅问题下方的讨论。
UPPER()
在此处不需要。它会为
分组按
进行额外的文件排序,而不是在
结果
@MarcusAdams上使用索引。首先,您假设OP使用的是SQL Server,其次,并非所有RDB都不区分大小写(即Oracle)。我开发的软件可以针对10个不同的数据库运行,因此我编写SQL查询来针对所有数据库运行。使用
groupby
WHERE Result='pass'
。鉴于OP提供的数据,我不会假设数据将包括“通过”和“通过”。我对使用
GROUP BY
中的函数提出了批评,甚至没有注意到您没有WHERE子句-2用于扫描所有行。@MarcusAdams-好的,现在我知道你最初在说什么了,我只是编辑了我的代码。如果你改进你的查询,或者至少解释一下你假设该列大小写不一的理由,我将删除否决票。别把它当回事,伙计。即使使用
WHERE
子句,除非删除
UPPER()
函数,否则仍会扫描所有行,但至少您尝试过了。
SELECT  RunName, SUM(CASE WHEN Result = 'fail' THEN 1 ELSE 0 END) as fails
FROM   TableA
GROUP BY RunName
SELECT a.RunName, COUNT(b.Result)
FROM TableA a LEFT JOIN TableA b ON a.id=b.id AND b.Result='fail'
GROUP BY RunName