首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql查询,在相同的输出中提供总和和子查询和。

问Mysql查询,在相同的输出中提供总和和子查询和。
EN

Stack Overflow用户
提问于 2017-07-13 15:24:35
回答 3查看 20关注 0票数 0

如何创建一个查询,该查询在一列中提供总和,而小计依赖于另一列中的查询?

给出下表

代码语言:javascript
复制
mysql> +------+------+------+--------+
-> | A    | B    | num  | status |
-> +------+------+------+--------+
-> | e    | f    |   34 | Y      |
-> | e    | f    |   45 | Y      |
-> | g    | h    |   22 | N      |
-> | a    | f    |   55 | Y      |
-> | d    | g    |   66 | N      |
-> | e    | f    |   67 | Y      |
-> | a    | f    |   88 | Y      |
-> | e    | g    |   36 | N      |
-> | d    | g    |   44 | N      |
-> | a    | h    |   33 | Y      |
-> | a    | g    |   33 | N      |
-> | e    | x    |  343 | Y      |
-> | a    | a    |   33 | N      |
-> +------+------+------+--------+
-> 13 rows in set (0.00 sec)

我想输出一个表,它显示:按A分组;num的总和num的总和,其中status = Y。

这是:

代码语言:javascript
复制
select A, sum(num),
       (select sum(num) from  test where ( status = 'Y')) 
from test 
group by A;

mysql> +------+----------+----------------------------------------------------+
-> | A    | sum(num) | (select sum(num) from  test where ( status = 'Y')) |
-> +------+----------+----------------------------------------------------+
-> | a    |      242 |                                                665 |
-> | d    |      110 |                                                665 |
-> | e    |      525 |                                                665 |
-> | g    |       22 |                                                665 |
-> +------+----------+----------------------------------------------------+

...provides错误的结果,偏离了方向。它给出了第3栏中所有A的总和。

我本希望:

代码语言:javascript
复制
mysql> +------+----------+----------------------------------------------------+
-> | A    | sum(num) | (select sum(num) from  test where ( status = 'Y')) |
-> +------+----------+----------------------------------------------------+
-> | a    |      242 |                                                176 |
-> | d    |      110 |                                                  0 |
-> | e    |      525 |                                                489 |
-> | g    |       22 |                                                  0 |
-> +------+----------+----------------------------------------------------+

br AK

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-07-13 15:31:04

你可以试试这个:

代码语言:javascript
复制
SELECT 
    `A`,
    SUM(`num`) as `sum_num`,
    SUM(IF(`status` = 'Y',`num`,0)) as `sum_status_yes`
FROM `test`
GROUP BY `A`
ORDER BY `A`;

您也可以使用此技术来获取计数、平均值等。

票数 0
EN

Stack Overflow用户

发布于 2017-07-13 15:29:39

您可以使用条件聚合:

代码语言:javascript
复制
select a, sum(num),
       sum(case when status = 'Y' then num else 0 end)
from t
group by a;
票数 0
EN

Stack Overflow用户

发布于 2017-07-13 15:30:33

代码语言:javascript
复制
SELECT A, SUM(num), SUM( IF( status='Y', num, 0 ) ) 
FROM test 
GROUP BY A
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45085050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档