Рассчитать разницу сумм разных строк - PullRequest
0 голосов
/ 24 сентября 2018

Я хотел бы рассчитать разницу между двумя суммами из разных таблиц моего запроса:

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;

результат первого запроса таков:

     id |  total
--------+----------
      1 |   999
      2 |   888
      3 |   999
      4 |   111

мой второй запрос:

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;

результат второго запроса выглядит следующим образом:

     id |  total
--------+----------
      1 |   999
      2 |   866
      3 |   330
      4 |    90

Я бы хотел объединить два запроса в один, чтобы узнать разницу между итоговыми столбцами, чтобы выводбудет выглядеть так:

     id |  diff
--------+----------
      1 |     0
      2 |    22
      3 |   660
      4 |    21

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

используйте объединение с общим табличным выражением

with t1 as

    (
    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 
    ), 

    t2 as
    (
    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
    ) select t1.id,t1.total-t2.total as diff 
      left join t2 on t1.id=t2.id

или используйте объединение всех

    with t1 as

    (
    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 
    ), 

    t2 as
    (
    SELECT b.id AS id, SUM(b.amount)*(-1) 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
    ) 
     select a.id,sum(total) as total from(
      select * from t1 union all select * from t2) a group by a.id
0 голосов
/ 24 сентября 2018

Вы можете попытаться использовать агрегатную функцию условия 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 могут вместо этогоВаш подзапрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...