gpt4 book ai didi

MySQL 查询分组依据,然后根据条件而不是求和取差

转载 作者:行者123 更新时间:2023-11-28 23:36:15 26 4
gpt4 key购买 nike

这是我的 table

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 行,则假设金额为 0。因此输出将是

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

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

最佳答案

您可以使用条件聚合:

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

关于MySQL 查询分组依据,然后根据条件而不是求和取差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35673602/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com