Как мне вернуть мои записи, сгруппированные по NULL и NOT NULL? - PullRequest
51 голосов
/ 27 октября 2008

У меня есть таблица со столбцом processed_timestamp - если запись была обработана, то это поле содержит дату и время, когда она была обработана, в противном случае она равна нулю.

Я хочу написать запрос, который возвращает две строки:

NULL        xx -- count of records with null timestamps
NOT NULL    yy -- count of records with non-null timestamps

Возможно ли это?

Обновление: Таблица довольно большая, поэтому эффективность важна. Я мог бы просто выполнить два запроса для вычисления каждого итогового значения отдельно, но я хочу избежать двойного попадания в таблицу, если я могу избежать этого.

Ответы [ 14 ]

0 голосов
/ 28 октября 2008

в Oracle

SELECT COUNT(*), COUNT(TIME_STAMP_COLUMN)
FROM TABLE;

count (*) возвращает количество всех строк

count (column_name) возвращает количество строк, которые не равны NULL, поэтому

SELECT COUNT(*) - COUNT(TIME_STAMP_COLUMN) NUL_COUNT,
                  COUNT(TIME_STAMP_COLUMN) NON_NUL_COUNT
FROM TABLE

должен сделать работу.

Если столбец проиндексирован, вы можете получить какое-то сканирование диапазона и избежать чтения таблицы.

0 голосов
/ 27 октября 2008
Select Sum(Case When processed_timestamp IS NULL
                         Then 1
                         Else 0
                 End)                                                               not_processed_count,
          Sum(Case When processed_timestamp Is Not NULL
                         Then 1
                         Else 0
                 End)                                                               processed_count,
          Count(1)                                                                total
From table

Редактировать: не читал внимательно, этот возвращает одну строку.

0 голосов
/ 27 октября 2008

[T-SQL]:

select [case], count(*) tally
from (
  select 
  case when [processed_timestamp] is null then 'null'
  else 'not null'
  end [case]
  from myTable
) a 

И вы можете добавить в оператор case любые другие значения, которые вы хотите создать, например, раздел. сегодня, вчера, с полудня до 14:00, после 18:00 в четверг.

0 голосов
/ 27 октября 2008

Мне лично нравится решение Pax, но если вам абсолютно требуется только одна возвращенная строка (как я недавно), в MS SQL Server 2005/2008 вы можете «сложить» два запроса, используя CTE

with NullRows (countOf)
AS
(
    SELECT count(*) 
    FORM table 
    WHERE [processed_timestamp] IS NOT NULL
)
SELECT count(*) AS nulls, countOf
FROM table, NullRows
WHERE [processed_timestamp] IS NULL
GROUP BY countOf

Надеюсь, это поможет

...