2017-03-27 33 views
0

我被困在如何实现以下内容。MySQL获取字段x等于y的行的百分比

我的订户表中的每行都有2个可为空的字段:type1和type3。这是空或1

我不能就如何创建检查行的每一个的2个选项

我的数据库看起来像这样的百分比查询身边让我的头。

+---------------+-------+-------+ 
|  email  | type1 | type2 | 
+---------------+-------+-------+ 
| [email protected] | 1  | null | 
| [email protected] | null | 1  | 
| [email protected] | 1  | 1  | 
+---------------+-------+-------+ 

我的理想查询返回以下结果。

+--------+----------------+ 
| Type | Amount of rows | 
+--------+----------------+ 
| type1 | 40%   | 
| type2 | 60%   | 
+--------+----------------+ 
+0

你可以发布你到目前为止尝试过的吗? –

+1

我不明白结果。这里的逻辑是什么? – GurV

+0

type1具有2个非null值作为type2。那么为什么百分比是40/60?不应该50/50?你的逻辑是什么? –

回答

2
count(x) 

返回与x的非空值的行的数目。

因此,你可以使用:

SELECT count(type1) as t1, count(type2) as t2, count(*) as nrows 

你显示:

100*t1/nrows 
100*t2/nrows 

现在,你想要的结果格式不同。这是你的问题,因为数据库的工作是处理数据,而不是格式化,显示或化妆品。只要数据以最有效的方式返回,那么返回数据的列/行格式无关紧要。显示和呈现是应用程序的工作。

如果你坚持,

SELECT 'type1', 100*count(type1)/count(*) 
UNION ALL 
SELECT 'type2', 100*count(type2)/count(*) 

当然,这将是慢一倍。

+0

事实上,他没有要求特定的查看格式,而是一种特定的关系格式,这完全在SQL的范围之内。 –

0
SELECT COUNT (*) FROM TABLE WHERE A = B 

然后由 SELECT COUNT (*) FROM TABLE

和多个结果100

0

把它查询:

SELECT CONCAT(COUNT(type1)*100/COUNT(email), "%") AS `type1`, CONCAT(COUNT(type2)*100/COUNT(email), "%") AS `type2` 

应返回:

+-------+-------+ 
| type1 | type2 | 
+-------+-------+ 
| '40%' | '40%' | 
+-------+-------+ 

如果您希望旋转到为存在:

+---------+-------+ 
| type | pct | 
+---------+-------+ 
| 'type1' | '40%' | 
+---------+-------+ 
| 'type2' | '40%' | 
+---------+-------+ 

那么您可能认为SELECTCREATE TEMPORARY TABLE ... FROM SELECT存储第一个结果在临时表中设置,然后SELECT ... UNION ALL ... SELECT为@peufeu建议,但没有性能损失这来自多次运行基础查询。