我有以下查询
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
答案 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'