我有一个SQL查询(SQL Server),按截止日期对我的信息进行分组。这工作正常。问题是,如果由于某种原因我一周内没有任何数据,那么那个星期将不会生成,我需要绘制的图表将是错误的。
这是我从查询中获得的示例数据:
这是我的疑问:
select
permittype,
count(0) as total,
DATEADD(dd, 0, DATEDIFF(dd, 0, DATEADD(d, 7 - DATEPART(DW, ei.createddate),ei.createddate))) as WeekEnding
from employee_incident ei
where ei.incidentcode = 'P'
and ei.isactive = 1
and ei.createddate >= DATEADD(month, -2, GETDATE())
group by
permittype,
DATEADD(dd, 0, DATEDIFF(dd, 0, DATEADD(d, 7 - DATEPART(DW, ei.createddate),ei.createddate)))
order by
DATEADD(dd, 0, DATEDIFF(dd, 0, DATEADD(d, 7 - DATEPART(DW, ei.createddate),ei.createddate))) desc
如果周'2015-11-14'没有数据我得到0作为总价值怎么办?现在,如果那个星期没有价值,我就不会得到这一行。
答案 0 :(得分:0)
这将需要Weeks表以及LEFT JOIN或FULL OUTER JOIN,具体取决于您启动查询的位置。在周表中,您可以创建一年中每周一条记录。您可以添加有关该周的各种数据,但我们可以从以下内容开始。
CREATE TABLE weeks (
week_number TINYINT NOT NULL PRIMARY KEY,
start_date DATETIME NOT NULL,
end_date DATETIME NOT NULL,
);
在下面的示例中,我使用了一个FULL OUTER JOIN,因为我已经直接从employee_incident表中获取了查询,但是如果您将其更改为从week表开始,则可以将LEFT JOIN挂到employee_incident表中。当employee_incident和COALESCE中没有数据时,我们使用COALESCE给出permit类型的默认值0,以便在有数据时优先从employee_incident获取数据。
CROSS APPLY是为了避免重复代码以获得周结束。我们写了一次然后可以使用它的别名。
SELECT COALESCE(permittype, 0) as permittype,
count(0) as total,
COALESCE(EndOfWeek, week.end_date) as WeekEnding
from employee_incident ei
cross apply (
select DATEADD(dd, 0, DATEDIFF(dd, 0, DATEADD(d, 7 - DATEPART(DW, ei.createddate),ei.createddate))) as EndOfWeek
) _
full outer join weeks on ei.WeekEnding = weeks.end_date
where (ei.incidentcode = 'P'
and ei.isactive = 1
and ei.createddate >= DATEADD(month, -2, GETDATE()))
or weeks.end_date is null
GROUP BY COALESCE(permittype, 0),
COALESCE(EndOfWeek, week.end_date)
ORDER BY WeekEnding DESC
我没有创建这些表并执行它,所以让我知道SQL中是否有任何错误。