SQL: вычесть один запрос из другого

Допустим, у меня есть две таблицы с именами tbl1 и tbl2 (разное количество столбцов и идентификаторов), и я получаю месячную сумму каждой таблицы, используя следующие запросы:

запрос1:

SELECT MONTHNAME(tbl1_date), SUM(col1+col2+col3+col4) 
FROM myTbl1 
GROUP BY YEAR(tbl1_date), MONTH(tbl1_date);

запрос2:

SELECT MONTHNAME(tbl2_date), SUM(col1+col2+col3+col4+col5+col6) 
FROM myTbl2 
GROUP BY YEAR(tbl2_date), MONTH(tbl2_date);

Как я могу вычесть запрос2 из запроса1 и получить разницу сумм?

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
0
45
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Соедините два запроса, а затем вычтите.

SELECT t1.month, t1.year, t1.total - t2.total AS diff
FROM (
    SELECT MONTHNAME(tbl1_date) AS month, YEAR(tbl1_date) AS year, SUM(col1+col2+col3+col4) AS total
    FROM myTbl1 
    GROUP BY YEAR(tbl1_date), MONTH(tbl1_date)
) AS t1
JOIN (
    SELECT MONTHNAME(tbl2_date) AS month, YEAR(tb2_date) AS year, SUM(col1+col2+col3+col4+col5+col6) AS total
    FROM myTbl2 
    GROUP BY YEAR(tbl2_date), MONTH(tbl2_date)
) AS t2 ON t1.month = t2.month AND t1.year = t2.year

Спасибо, что нашли время, чтобы помочь мне.

alien250 31.05.2019 11:37

Если в таблицах могут быть разные месяцы а также, вам нужны все строки, тогда вам действительно нужен full join. MySQL не поддерживает это, но вы можете использовать union all и group by в этом случае:

SELECT yyyy, mon, SUM(s) - SUM(s2) as diff
FROM ((SELECT YEAR(tbl1_date) as yyyy,
              MONTHNAME(tbl1_date) as mon, 
              SUM(col1+col2+col3+col4) as s1, 0 as s2
       FROM myTbl1 
       GROUP BY YEAR(tbl1_date), MONTH(tbl1_date)
      ) UNION ALL
      (SELECT YEAR(tbl2_date) as yyyy,
              MONTHNAME(tbl2_date) as mon, 
              0, SUM(col1+col2+col3+col4) as s2
       FROM myTbl12
       GROUP BY YEAR(tbl2_date), MONTH(tbl2_date)
      )
     ) ym
GROUP BY yyyy, mon;

Спасибо, что нашли время, чтобы помочь мне. В этом случае таблицы имеют одинаковые месяцы, и мне нужны месяцы по порядку. Спасибо еще раз!

alien250 31.05.2019 11:41

Другие вопросы по теме