Вы можете попытаться использовать агрегатную функцию условия do SUM
, затем вычитать из двух SUM
результатов.
SELECT a.id AS id,
SUM(CASE WHEN a.start_date BETWEEN a.start_date AND '1996-01-01' THEN a.amount ELSE 0 END)
- SUM(CASE WHEN a.end_date BETWEEN a.end_date AND '1996-01-01' THEN b.amount ELSE 0 END) AS diff
FROM atable a
LEFT JOIN btable b ON a.id = b.id
GROUP BY a.id
ORDER BY a.id;
или вы можете попробовать написать подзапрос join
, затем на id
,затем выполните вычитание.
SELECT t1.id,
t1.total - t2.total AS diff
FROM (SELECT a.id AS id,
Sum(a.amount) AS total
FROM atable a
LEFT JOIN btable b
ON a.id = b.id
WHERE a.start_date BETWEEN a.start_date AND '1996-01-01'
GROUP BY a.id
ORDER BY a.id) t1
JOIN(SELECT b.id AS id,
Sum(b.amount) AS total
FROM atable a
LEFT JOIN btable b
ON a.id = b.id
WHERE a.end_date BETWEEN a.end_date AND '1996-01-01'
GROUP BY b.id
ORDER BY b.id) t2
ON t1.id = t2.id
Схема (PostgreSQL v9.6)
CREATE TABLE T1(
id INT,
total INT
);
INSERT INTO T1 VALUES (1,999);
INSERT INTO T1 VALUES (2,888);
INSERT INTO T1 VALUES (3,999);
INSERT INTO T1 VALUES (4,111);
CREATE TABLE T2(
id INT,
total INT
);
INSERT INTO T2 VALUES (1,999);
INSERT INTO T2 VALUES (2,866);
INSERT INTO T2 VALUES (3,330);
INSERT INTO T2 VALUES (4,90);
Запрос # 1
SELECT t1.id,
t1.total - t2.total AS diff
FROM T1 t1
JOIN T2 t2
ON t1.id = t2.id;
| id | diff |
| --- | ---- |
| 1 | 0 |
| 2 | 22 |
| 3 | 669 |
| 4 | 21 |
Посмотреть на БД Fiddle
ПРИМЕЧАНИЕ
T1
и T2
могут вместо этогоВаш подзапрос.