Как написать sql на вычитание данных?

Ссылка скопирована
1 ответ

Привет, хотелось бы получить помощь в решении вопроса, что то никак не пойму как это сделать.

Есть два запроса:
1 запрос.

SELECT wp_posts.post_title, v2.meta_value FROM wp_posts JOIN wp_postmeta v1 ON (wp_posts.ID = v1.post_id) JOIN wp_postmeta v2 ON (wp_posts.ID = v2.post_id) WHERE ((v1.meta_key = 'id_rab_1' AND v1.meta_value = '981' AND v2.meta_key = 'summa_rab_1' ) OR (v1.meta_key = 'id_rab_2' AND v1.meta_value = '981' AND v2.meta_key = 'summa_rab_2' )) and wp_posts.post_date between '2022-08-01' and '2022-09-01'

SELECT wp_posts.post_title, v2.meta_value FROM wp_posts JOIN wp_postmeta v1 ON (wp_posts.ID = v1.post_id) JOIN wp_postmeta v2 ON (wp_posts.ID = v2.post_id) WHERE ((v1.meta_key = 'id_rab_1' AND v1.meta_value = '981' AND v2.meta_key = 'summa_rab_1' ) OR (v1.meta_key = 'id_rab_2' AND v1.meta_value = '981' AND v2.meta_key = 'summa_rab_2' )) and wp_posts.post_date between '2022-08-01' and '2022-09-01'

Этим запросом я получаю посты в которых участвовал сотрудник "981" и сколько он за это получил.

2 запрос.

SELECT wp_posts.post_title, v2.meta_value FROM wp_posts JOIN wp_postmeta v1 ON (wp_posts.ID = v1.post_id) JOIN wp_postmeta v2 ON (wp_posts.ID = v2.post_id) WHERE v1.meta_key = 'id_sotrudnika' AND v1.meta_value = '981' AND v2.meta_key = 'summa_poluchennoj_zarplaty'  and wp_posts.post_date between '2022-08-01' and '2022-09-01'

SELECT wp_posts.post_title, v2.meta_value FROM wp_posts JOIN wp_postmeta v1 ON (wp_posts.ID = v1.post_id) JOIN wp_postmeta v2 ON (wp_posts.ID = v2.post_id) WHERE v1.meta_key = 'id_sotrudnika' AND v1.meta_value = '981' AND v2.meta_key = 'summa_poluchennoj_zarplaty' and wp_posts.post_date between '2022-08-01' and '2022-09-01'

Этим запросом я получаю количество раз когда сотруднику "981" выдавалась зарплата и ее сумма

Вопрос в следующем как из суммы первого запроса вычесть сумму второго запроса? Получается нужно суммировать всю начисленную зарплату, и минусовать сумму уже выданной.

База получается одна или для первого и второго запроса wp_posts через join соединяется с wp_postmeta. Единственная разница между постами это post_type, у первого запроса post_type = zakazy, у второго post_type = zarplata.

Дополнительно:

Ответы:

-- Query 1: All records  SELECT  	wp_posts.post_title,  	CASE  		WHEN v1.meta_key = 'id_sotrudnika' AND v2.meta_key = 'summa_poluchennoj_zarplaty'  		THEN -v2.meta_value 		ELSE v2.meta_value 	END AS netto FROM wp_posts JOIN wp_postmeta v1 ON (wp_posts.ID = v1.post_id) JOIN wp_postmeta v2 ON (wp_posts.ID = v2.post_id) WHERE 	v1.meta_key IN ('id_rab_1', 'id_sotrudnika') AND v1.meta_value = '981' AND  	v2.meta_key  IN ('summa_rab_1', 'summa_rab_2', 'summa_poluchennoj_zarplaty');    -- Query 2: Summarized records  SELECT  	wp_posts.post_title,  	SUM(CASE  		WHEN v1.meta_key = 'id_sotrudnika' AND v2.meta_key = 'summa_poluchennoj_zarplaty'  		THEN -v2.meta_value 		ELSE v2.meta_value 	END) AS netto FROM wp_posts JOIN wp_postmeta v1 ON (wp_posts.ID = v1.post_id) JOIN wp_postmeta v2 ON (wp_posts.ID = v2.post_id) WHERE 	v1.meta_key IN ('id_rab_1', 'id_sotrudnika') AND v1.meta_value = '981' AND  	v2.meta_key  IN ('summa_rab_1', 'summa_rab_2', 'summa_poluchennoj_zarplaty');

-- Query 1: All records SELECT wp_posts.post_title, CASE WHEN v1.meta_key = 'id_sotrudnika' AND v2.meta_key = 'summa_poluchennoj_zarplaty' THEN -v2.meta_value ELSE v2.meta_value END AS netto FROM wp_posts JOIN wp_postmeta v1 ON (wp_posts.ID = v1.post_id) JOIN wp_postmeta v2 ON (wp_posts.ID = v2.post_id) WHERE v1.meta_key IN ('id_rab_1', 'id_sotrudnika') AND v1.meta_value = '981' AND v2.meta_key IN ('summa_rab_1', 'summa_rab_2', 'summa_poluchennoj_zarplaty'); -- Query 2: Summarized records SELECT wp_posts.post_title, SUM(CASE WHEN v1.meta_key = 'id_sotrudnika' AND v2.meta_key = 'summa_poluchennoj_zarplaty' THEN -v2.meta_value ELSE v2.meta_value END) AS netto FROM wp_posts JOIN wp_postmeta v1 ON (wp_posts.ID = v1.post_id) JOIN wp_postmeta v2 ON (wp_posts.ID = v2.post_id) WHERE v1.meta_key IN ('id_rab_1', 'id_sotrudnika') AND v1.meta_value = '981' AND v2.meta_key IN ('summa_rab_1', 'summa_rab_2', 'summa_poluchennoj_zarplaty');

SQL editor online

  • Привет, спасибо за ответ, только я не силен в sql. Это два разных запроса или один? Я что-то не пойму, как и что, среди этого я заметил, что нет значения meta_key = id_sotrudnika и meta_key = id_rab_2.
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Антон С. Ответ

Для написания SQL запроса на вычитание данных из одной таблицы из другой используется оператор MINUS или EXCEPT, в зависимости от используемой СУБД.

Пример SQL запроса на вычитание данных из одной таблицы из другой для PostgreSQL или Oracle с использованием оператора EXCEPT:

SELECT column1, column2
FROM table1
EXCEPT
SELECT column1, column2
FROM table2;

SELECT column1, column2 FROM table1 EXCEPT SELECT column1, column2 FROM table2;

В данном примере мы выбираем столбцы column1 и column2 из таблицы table1, за исключением тех строк, которые присутствуют в таблице table2.

Если вы используете СУБД MySQL, то оператор MINUS не поддерживается, поэтому вам придется использовать другие способы для выполнения подобного действия. Один из способов - использование оператора NOT IN:

SELECT column1, column2
FROM table1
WHERE (column1, column2) NOT IN
(SELECT column1, column2
FROM table2);

SELECT column1, column2 FROM table1 WHERE (column1, column2) NOT IN (SELECT column1, column2 FROM table2);

Этот запрос выберет все записи из таблицы table1, которые не совпадают с записями из таблицы table2 по столбцам column1 и column2.

Помните, что при написании SQL запросов на вычитание данных, необходимо убедиться, что столбцы и условия соответствуют вашим требованиям, чтобы избежать непредвиденных результатов.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно