Выберите оператор Возврат 0, если ноль - PullRequest
3 голосов
/ 19 октября 2011

У меня есть следующий запрос

SELECT ProgramDate, [CountVal]= COUNT(ProgramDate) 
FROM ProgramsTbl 
WHERE (Type = 'Type1' AND ProgramDate = '10/18/11' )
GROUP BY ProgramDate 

Что происходит, если нет записи, соответствующей типу и дате программы, я не получаю никаких записей.

То, что я хотел бы вывести в приведенном выше примере, выглядит примерно так, если не возвращаются значения. Обратите внимание, что для CountVal у нас есть 0, даже если нет возвращаемых записей, которые соответствуют условию соответствия:

ProgramDate    CountVal
10/18/11       0

Ответы [ 6 ]

1 голос
/ 19 октября 2011

Это немного сложнее, чем хотелось бы, однако, это очень возможно. Сначала вам нужно будет создать временную таблицу дат. Например, запрос ниже создает диапазон дат от 2011-10-11 до 2011-10-20

CREATE TEMPORARY TABLE date_stamps AS
SELECT (date '2011-10-10' + new_number) AS date_stamp
FROM generate_series(1, 10) AS new_number;

Используя эту временную таблицу, вы можете выбрать из нее и слева присоединиться к вашему столу ProgramsTbl. Например

SELECT date_stamp,COUNT(ProgramDate) 
FROM date_stamps 
LEFT JOIN ProgramsTbl ON ProgramsTbl.ProgramDate = date_stamps.date_stamp
WHERE Type = 'Type1' 
GROUP BY ProgramDate;
0 голосов
/ 19 октября 2011

Гранж, но просто и эффективно

    SELECT '10/18/11' as 'Program Date', count(*) as 'count'
    FROM ProgramsTbl 
    WHERE Type = 'Type1' AND ProgramDate = '10/18/11'
0 голосов
/ 19 октября 2011

Вот решение, которое работает на SQL Server; не уверен насчет других платформ БД:

DECLARE @Type VARCHAR(5) = 'Type1'
  , @ProgramDate DATE = '10/18/2011'


SELECT  pt.ProgramDate
      , COUNT(pt2.ProgramDate)
FROM    ( SELECT    @ProgramDate AS ProgramDate
                  , @Type AS Type
        ) pt
        LEFT JOIN ProgramsTbl pt2 ON pt.Type = pt2.Type
                                     AND pt.ProgramDate = pt2.ProgramDate
GROUP BY pt.ProgramDate
0 голосов
/ 19 октября 2011

Поскольку каждый оператор SELECT действительно создает таблицу записей, вы можете использовать запрос SELECT для построения таблицы с количеством программ и счетчиком по умолчанию, равным нулю. Для этого потребуются два запроса SELECT (один для получения действительного числа, другой для получения значения по умолчанию) и использование UNION для объединения двух результатов SELECT в одну таблицу.

Оттуда вы можете ВЫБРАТЬ из таблицы UNIONed для суммирования CountVals (если в таблице ProgramTate встречается programDate, CountVal CountVal первого запроса, если он существует (> 0) + CountVal второго запроса (= 0)).

Таким образом, даже если в ProgramTable нет записей для нужной ProgramDate, вы получите запись обратно с указанием счетчика 0.

Это будет выглядеть так:

SELECT ProgramDate, SUM(CountVal)
FROM
    (SELECT ProgramDate, COUNT(*) AS CountVal
    FROM ProgramsTbl
    WHERE (Type = 'Type1' AND ProgramDate = '10/18/11' )
    UNION
    SELECT '10/18/11' AS ProgramDate, 0 AS CountVal) T1
0 голосов
/ 19 октября 2011
Select ProgramDate, [CountVal]= SUM(occur) 
from
(
SELECT ProgramDate, 1 occur
FROM ProgramsTbl 
WHERE (Type = 'Type1' AND ProgramDate = '10/18/11' )

UNION

SELECT '10/18/11', 0
)
GROUP BY ProgramDate 
0 голосов
/ 19 октября 2011

Попробуйте что-нибудь в этом духе.Это создаст строку с датой 18.10.11, которая обязательно вернется.Затем вы оставили соединение с вашими фактическими данными, чтобы получить желаемое количество (которое теперь может возвращать 0, если нет соответствующих строк).

Чтобы сделать это для более чем 1 даты, вы хотите построить датутаблица, содержащая список всех дат, которые вы хотите запросить (поэтому замените «select '10 / 18/11 '» на «select Date from DateTbl»).Вы можете использовать для запросов, сделать это (предполагается, SQL Server 2005 +):

create table Dates (MyDate datetime)
go

insert into Dates
select top 100000 row_number() over (order by s1.name) 
from master..spt_values s1, master..spt_values s2
go
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...