MySQL查询分组,然后根据条件而不是总和

时间:2016-02-27 18:21:42

标签: mysql sql group-by

这是我的表

Type  Amount  Year  Month
P     10      2016  1
P     15      2016  2
T     5       2016  1
T     20      2016  3

P和T只有一个月 - 年的组合。换句话说,P不能有两行具有相同的年和月组合。

这是我想做的事情

获取月份和年份相同的金额(P行中的金额减去T行中的金额)的差异。如果没有相应的P或T行,则假设amount为0.因此输出将为

Amount  Year  Month
5       2016  1 
15      2016  2
-20     2016  3

这样做的最简单方法是什么(简单来说,我的意思是代码重复次数最少)。我能想到的一种方法是首先将P和T行分成两个单独的派生表(使用select语句),然后使用右连接执行左连接联合,但这涉及大量代码重复。

1 个答案:

答案 0 :(得分:1)

您可以使用条件聚合:

SELECT `Year`, `Month`,
        SUM(CASE WHEN `Type` = 'P' THEN `Amount` ELSE -`Amount` END) AS Amount
FROM tab
GROUP BY `Year`, `Month`;

输出:

╔══════╦═══════╦════════╗
║ Year ║ Month ║ Amount ║
╠══════╬═══════╬════════╣
║ 2016 ║     1 ║      5 ║
║ 2016 ║     2 ║     15 ║
║ 2016 ║     3 ║    -20 ║
╚══════╩═══════╩════════╝

LiveDemo

使用IF function

SELECT `Year`, `Month`,
        SUM(IF(`Type` = 'P', `Amount`, -`Amount`)) AS Amount
FROM tab
GROUP BY `Year`, `Month`;

另一种方法是使用UNION ALL

SELECT `Year`, `Month`, SUM(`Amount`) AS Amount
FROM (SELECT `Year`, `Month`, `Amount`
      FROM tab
      WHERE `Type` = 'P'
      UNION ALL
      SELECT `Year`, `Month`, -`Amount`
      FROM tab
      WHERE `Type` = 'T') AS sub
GROUP BY `Year`, `Month`;

LiveDemo2