我必须根据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。
答案 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
。只需取总和即可计算该值为真的次数。