选择语句返回0,如果为空

时间:2011-10-19 14:33:31

标签: sql null

我有以下查询

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

如果没有与Type和ProgramDate匹配的记录,我将不会返回任何记录。

如果没有返回值,我想在上面输出的内容如下所示。请注意,即使没有返回符合匹配条件的记录,CountVal如何为0:

ProgramDate    CountVal
10/18/11       0

6 个答案:

答案 0 :(得分:1)

这比你想要的要复杂一点,但是很有可能。您首先必须创建一个临时的日期表。例如,下面的查询会创建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;

答案 1 :(得分:0)

沿着这些方向尝试一些事情。这将建立一个日期为10/18/11的行,肯定会返回。然后你就加入你的实际数据来获得你想要的数量(如果没有相应的行,现在可以返回0)。

要为超过1个日期执行此操作,您需要构建一个日期表,其中包含您要查询的所有日期的列表(因此将“select '10 / 18/11”替换为“选择日期”来自DateTbl“)。

SELECT ProgDt.ProgDate, [CountVal]= COUNT(ProgramsTbl.ProgramDate) 
FROM (SELECT '10/18/11' as 'ProgDate') ProgDt
LEFT JOIN ProgramsTbl 
    ON ProgDt.ProgDate = ProgramsTbl.ProgramDate
WHERE (Type = 'Type1')
GROUP BY ProgDt.ProgDate 

要创建可用于查询的日期表,请执行此操作(假定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

答案 2 :(得分:0)

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 

答案 3 :(得分:0)

因为每个SELECT语句实际上都在构建一个记录表,所以您可以使用SELECT查询来构建一个包含程序计数和默认计数为零的表。这将需要两个SELECT查询(一个用于获取实际计数,一个用于获取默认计数)并使用UNION将两个SELECT结果组合到一个表中。

从那里你可以从UNIONed表中选择SELECT来累加CountVals(如果programDate出现在ProgramTable中,则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

答案 4 :(得分:0)

这是一个适用于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

答案 5 :(得分:0)

垃圾但简单而有效

    SELECT '10/18/11' as 'Program Date', count(*) as 'count'
    FROM ProgramsTbl 
    WHERE Type = 'Type1' AND ProgramDate = '10/18/11'