Вычитание двух операторов COUNT (*) возвращает правильное число, но 12 000 строк - PullRequest
0 голосов
/ 14 февраля 2019

Я хочу вычесть их, чтобы показать, что за последнюю неделю было общее увеличение (или потеря) заданий.результат возвращает правильный результат, но 12 000 раз.

У меня есть два запроса, каждый из которых возвращает число 6 и 4. Я хочу вычесть их, чтобы показать, что за последнюю неделю было общее увеличение (или потеря) заданий.

SELECT (SELECT Count(*) FROM db1 WHERE db1.[creation date] >Date()-7)
      -(SELECT Count(*) FROM db1 WHERE db1.[completed date] >Date()-7)
FROM db1

Когда я запускаю этот запрос, он возвращает правильное число, но повторяет число 12 000 раз, по одному разу для каждой записи.Я просто хочу вернуть одно число, чтобы использовать его в текстовом поле формы.

Ответы [ 5 ]

0 голосов
/ 15 февраля 2019

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

=DCount( "*", "db1", "[creation date] >Date()-7" ) - DCount( "*", "db1", "[completed date] >Date()-7" ) 

Хотя вам, возможно, придется немного его настроить(синтаксически), прошло уже много лет с тех пор, как у меня был установлен доступ на этой машине.:)

0 голосов
/ 15 февраля 2019

Я мог бы предложить следующее в качестве альтернативы условной агрегации:

select a.c1 - b.c2
from
(select count(*) as c1 from db1 where db1.[creation date]  > Date()-7) a,
(select count(*) as c2 from db1 where db1.[completed date] > Date()-7) b

Выше используется декартово произведение (также известное как перекрестное соединение).Это означает, что для каждой записи, выводимой из первой таблицы, каждая запись выводится из второй таблицы (т. Е. Общее количество выводимых записей - это количество записей в каждой таблице, умноженных вместе).

Однако, посколькукаждый подзапрос в этом конкретном декартовом произведении будет когда-либо возвращать одну запись (результат count(*) для заданных условий), окончательный результат получен из набора данных, состоящего из записи 1x1 = 1, содержащей два значениябыть вычтенным.

0 голосов
/ 14 февраля 2019

попробуйте

SELECT * FROM (
(SELECT Count() FROM db1 WHERE db1.[creation date] >Date()-7) -
(SELECT Count() FROM db1 WHERE db1.[completed date] >Date()-7)
)

пс: не проверено!

0 голосов
/ 14 февраля 2019

Вы возвращаете 12 000 строк, потому что ваша таблица db1 имеет 12 000 строк.Вам нужно использовать предложение FROM с таблицей, которая имеет только одну запись, создать таблицу, эквивалентную DUAL в Oracle.

Попробуйте это:

-- Create DUAL Table
CREATE TABLE DUAL
(
   DUMMY VARCHAR(1)
);

INSERT INTO DUAL (DUMMY) VALUES ('X');

--Use Dual Table for your computation
SELECT 
(SELECT Count(*) FROM db1 WHERE db1.[creation date] >Date()-7)
-
(SELECT Count(*) FROM db1 WHERE db1.[completed date] >Date()-7) AS COUNT_DIFF
FROM DUAL;
0 голосов
/ 14 февраля 2019

Я думаю, что вы хотите:

SELECT (SUM(IIF(db1.[creation date] > Date() - 7, 1, 0)) -
        SUM(IIF(db1.[completed date] > Date()-7, 1, 0))
       )
FROM db1;

Вы путаете подзапросы и внешние запросы.В вашей версии у вас есть запрос на db1 - на всю таблицу.Это не запрос агрегации, поэтому возвращается каждая строка.Что содержит результат?Он содержит результаты подзапросов - но повторяется для каждой строки.Вы можете добавить db1.* к select, чтобы увидеть это.

Эта версия является запросом агрегации.Для получения результата используется условное агрегирование.И это должно быть намного быстрее, чем ваша версия.

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