SQL如何从现在开始两个月到过去

时间:2015-11-20 00:18:30

标签: sql sql-server

我有一个SQL查询(SQL Server),按截止日期对我的信息进行分组。这工作正常。问题是,如果由于某种原因我一周内没有任何数据,那么那个星期将不会生成,我需要绘制的图表将是错误的。

这是我从查询中获得的示例数据:

enter image description here

这是我的疑问:

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作为总价值怎么办?现在,如果那个星期没有价值,我就不会得到这一行。

1 个答案:

答案 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中是否有任何错误。