MySQL - 在多行输出的情况下计算不同条件的结果

时间:2014-07-07 14:57:06

标签: mysql sql subquery counting

我必须根据XLS导出的4个不同标准获得结果。

以下是创建表格代码:

CREATE TABLE IF NOT EXISTS `relation_tc_agri` (
  `tc_id` varchar(255) NOT NULL,
  `agri_id` varchar(255) NOT NULL,
  `state` smallint(6) NOT NULL,
  `send_email` smallint(1) unsigned NOT NULL default '1',
  KEY `tc_id` (`tc_id`),
  KEY `agri_id` (`agri_id`)
) ENGINE=InnoDB

以及一些示例(为了演示而稍作修改):

+-----------+-------------+-------+------------+
| tc_id     | agri_id     | state | send_email |
+-----------+-------------+-------+------------+
| 045bd915c | 2a6ad61aa   | 0     | 1          |
| f50d6b1eb | 413bc4026   | 1     | 1          |
| f50d6b1eb | 1475f4ba4   | 1     | 1          |
| f50d6b1eb | 1475f4ba4   | 2     | 1          |
| gd865be6e | 1475f4ba4   | 2     | 1          |
| d0dbfa93d | 90b3fefcf   | 3     | 0          |
+-----------+-------------+-------+------------+

我有四个不同的状态(0,1,2和3),并且必须计算每个tc_id的每个结果的数量。

预期输出:

+-----------+------------+------------------+-----------------+-----------------+
| tc_id     | total rows | rows with state 1| rows with state2| rows with state3|
+-----------+------------+------------------+-----------------+-----------------+
| 045bd915c | 1          | 0                | 0               | 0               |
| f50d6b1eb | 3          | 2                | 1               | 0               |
| gd865be6e | 1          | 0                | 1               | 0               |
| d0dbfa93d | 1          | 0                | 0               | 1               |
+-----------+------------+------------------+-----------------+-----------------+

使用以下方法计算每个tc_id的总行数(状态0,1,2和3)是没有问题的:

COUNT(*) AS "total rows"

但是当计算状态为1或2或3的行时,我遇到了错误。我尝试了几个JOIN甚至子查询(这是坏的和慢的),IN来摆脱“Subquery返回多于1个结果”的消息等等。

如果有人让我走上正确的道路,我将不胜感激;)

提前多多感谢!

干杯。

EM。

1 个答案:

答案 0 :(得分:1)

您可以使用条件聚合执行此操作。在MySQL中,这看起来像:

select tc_id, count(*) as totalrows,
       sum(state = 1) as state_1,
       sum(state = 2) as state_2,
       sum(state = 3) as state_3
from relation_tc_agri
group by tc_id;

MySQL将布尔值视为数字,其中true为1,false为0。只需取总和即可计算该值为真的次数。