Mysql查询在同一输出中提供totalalsum和subquery sum

时间:2017-07-13 15:24:36

标签: mysql

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

给出下表

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的总和。

此:

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 |
-> +------+----------+----------------------------------------------------+

...提供错误的结果,当然。它给出了第3列中所有A的总和。

我希望:

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

3 个答案:

答案 0 :(得分:0)

您可以使用条件聚合:

select a, sum(num),
       sum(case when status = 'Y' then num else 0 end)
from t
group by a;

答案 1 :(得分:0)

SELECT A, SUM(num), SUM( IF( status='Y', num, 0 ) ) 
FROM test 
GROUP BY A

答案 2 :(得分:0)

你可以尝试一下:

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`;

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