gpt4 book ai didi

MySQL如何根据日期将两列加/减?

转载 作者:行者123 更新时间:2023-11-29 14:02:36 28 4
gpt4 key购买 nike

我有两个选择语句,它们从两个不同的表中获取值。select 语句看起来像这样

SELECT year(timestamp) y, month(timestamp) m, count(id) c
FROM table
WHERE clause="foo"
GROUP BY year(timestamp), month(timestamp)

它返回类似的内容

|-y--|-m|c|
|2013|01|9|
|2013|02|9|
|2013|03|9|
|2013|04|9|

.

SELECT year(timestamp) y, month(timestamp) m, count(id) c
FROM table2
WHERE clause="foo"
GROUP BY year(timestamp), month(timestamp)

它返回类似的内容

|-y--|-m|c|
|2013|01|1|
|2013|03|1|
|2013|04|1|

我正在寻找的是根据时间戳连接两个表,然后从第一个表中减去第二个表。所以它应该看起来像:

|-y--|-m|c|
|2013|01|8|
|2013|02|9|
|2013|03|8|
|2013|04|8|

谢谢!

最佳答案

假设 TableA 有您的主记录,那么类似这样的操作应该有效:

SELECT t.y, t.m, t.c - IFNULL(t2.c,0) c
FROM
(
SELECT year(timestamp) y, month(timestamp) m, count(id) c
FROM table
WHERE clause="foo"
GROUP BY year(timestamp), month(timestamp)
) t
LEFT JOIN (
SELECT year(timestamp) y, month(timestamp) m, count(id) c
FROM table2
WHERE clause="foo"
GROUP BY year(timestamp), month(timestamp)
) t2 ON t.y = t2.y AND t.m = t2.m
UNION
SELECT t.y, t.m, (t.c * -1) c
FROM
(
SELECT year(timestamp) y, month(timestamp) m, count(id) c
FROM table2
WHERE clause="foo"
GROUP BY year(timestamp), month(timestamp)
) t
LEFT JOIN (
SELECT year(timestamp) y, month(timestamp) m, count(id) c
FROM table
WHERE clause="foo"
GROUP BY year(timestamp), month(timestamp)
) t2 ON t.y = t2.y AND t.m = t2.m
WHERE t2.y IS NULL
ORDER BY y, m

我已经更新了答案。联合的第一部分返回表中包含或不包含 table2 中匹配的所有记录,并减去 table2 计数(如果可用)。联合的第二部分返回 table2 中不存在于表中的所有记录,将计数列乘以 -1。

可能有更简单的方法,但在没有真正理解表格的情况下,这是我能提供的最好方法。不幸的是,MySQL 不支持 FULL OUTER JOIN,这可以减少对 UNION 的需求。

关于MySQL如何根据日期将两列加/减?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14842958/

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