Как написать sql на вычитание данных?
Привет, хотелось бы получить помощь в решении вопроса, что то никак не пойму как это сделать.
Есть два запроса:
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.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для написания SQL запроса на вычитание данных из одной таблицы из другой используется оператор MINUS или EXCEPT, в зависимости от используемой СУБД.
Пример SQL запроса на вычитание данных из одной таблицы из другой для PostgreSQL или Oracle с использованием оператора EXCEPT:
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);
Этот запрос выберет все записи из таблицы table1, которые не совпадают с записями из таблицы table2 по столбцам column1 и column2.
Помните, что при написании SQL запросов на вычитание данных, необходимо убедиться, что столбцы и условия соответствуют вашим требованиям, чтобы избежать непредвиденных результатов.