这是我的表
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语句),然后使用右连接执行左连接联合,但这涉及大量代码重复。
答案 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
强>