Вычитание между двумя запросами sql

У меня есть 2 запроса в MS SQL, которые возвращают несколько результатов с помощью функции COUNT.

Я могу запустить первый запрос и получить первый результат, а затем запустить другой, чтобы получить другой результат, вычесть их и найти результаты; однако есть ли способ объединить все 3 функции и получить 1 общий результат

Например: запустить sql1 запустить sql2 запустить SQL3 (sql1-sql2)?....

Я пробовал их с xxxx как функцию, но не повезло.


person andreas    schedule 19.10.2009    source источник
comment
Расскажите немного подробнее о структуре таблиц и о том, какие данные вы хотите получить. Возможно, запросы можно переписать, чтобы выбрать то, что вы хотите, только с одним запросом.   -  person Vincent Ramdhanie    schedule 19.10.2009
comment
Если вы не предоставите структуры таблиц, образцы данных, ожидаемый результат, как вы думаете, как мы должны вам помочь????   -  person Eric    schedule 07.04.2018


Ответы (9)


Для этого вы должны иметь возможность использовать подзапросы:

SELECT
    (SELECT COUNT(*) FROM ... WHERE ...)
  - (SELECT COUNT(*) FROM ... WHERE ...) AS Difference

Только что протестировал:

Difference
-----------
45

(1 row(s) affected)
person Joey    schedule 19.10.2009
comment
Привет, я попробовал этот метод, и он дает мне ОШИБКУ 1242 (21000) в строке 4: подзапрос возвращает более 1 строки. Какие-либо предложения? - person Nicky Mirfallah; 10.02.2016
comment
Да. Убедитесь, что вы возвращаете только одну строку, иначе вы не сможете использовать ее как скаляр. Сообщение об ошибке довольно ясно в этом отношении. Возможно, вам следует проверить, в чем разница между вашей проблемой и той, которая указана в вопросе. - person Joey; 10.02.2016
comment
Я решаю тот же вопрос, и это мой запрос: ВЫБЕРИТЕ (ВЫБЕРИТЕ СЧЕТЧИК (ГОРОД) ОТ СТАНЦИИ) - (ВЫБЕРИТЕ СЧЕТЧИК (ГОРОД) ИЗ ГРУППЫ СТАНЦИЙ ПО (ГОРОДУ)) КАК РАЗНИЦА - person Nicky Mirfallah; 10.02.2016
comment
Вы случайно не заметили дополнительный group by в своем запросе? Вы пробовали подзапросы сами по себе? Вы заметили что-то, из-за чего их нельзя рассматривать как скаляр? - person Joey; 10.02.2016

Это вернет разницу

SELECT COUNT(Attribute) - COUNT(DISTINCT Attribute) FROM table_name;
person sourabh bodkhe    schedule 26.11.2019
comment
Я считаю, что этот ответ неверен. Возможно, я что-то неправильно понял. Не могли бы вы немного уточнить? - person Binarus; 27.11.2019

Я знаю, что это старый пост, но вот еще одно решение, которое лучше всего подходит для моих нужд (проверено на firebird)

SELECT c1-c2 from (select count(*) c1 from t1), (SELECT COUNT(*) c2 from t2);
person Sven M.    schedule 09.12.2016

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

SELECT (select COUNT(FIRSTNAME) FROM TRMDW.EMPLOYEE1) - (SELECT COUNT(DISTINCT FIRSTNAME) FROM TRMDW.EMPLOYEE1) as difference from dual;
person Ayesha Shaik    schedule 03.10.2018

Просто создайте встроенную функцию с логикой вашего запроса и верните результат. Передайте параметры по мере необходимости.

person John Lechowicz    schedule 19.10.2009

SELECT (count(*) from t1) - (count(*) from t2);

это сработало для меня.

Также, если есть только одна таблица, вы также можете сделать:

SELECT (count(column1)) - count(column2)) from table; 
person Csaxena    schedule 28.03.2018

Это можно сделать одним запросом:

SELECT COUNT(col_name) - COUNT(DISTINCT col_name) as Difference from table_name;
person Sanjay C    schedule 24.03.2020
comment
Привет Санджай. Верно, но вы только повторяете здесь еще один ответ, который был опубликован некоторое время назад. Пожалуйста, не повторяйте существующие ответы. - person TT.; 24.03.2020

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

((SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(m,'/',2),'/',-1) 
FROM ms WHERE ms.id=t.m_id)-(SELECT COUNT(id) FROM t AS tr WHERE tr.m_id=t.m_id)) AS remaining
person Faysal Ahmed Raju    schedule 22.10.2017

person    schedule
comment
СПАСИБО, это решает :)... самое простое... аааа иногда - person andreas; 19.10.2009
comment
Спасибо! Это было так просто, но во всем Интернете люди предлагают использовать экстравагантную логику SQL, чтобы получить это, когда достаточно простого минуса. - person Siddhartha; 22.04.2015
comment
также добавив DISTINCT в запрос, вот как вы это сделаете SELECT (SELECT COUNT(CITY) FROM STATION) - (SELECT COUNT(DISTINCT CITY) FROM STATION) - person tsando; 09.04.2018