Sql server 将新行添加到MSSQL中的结果集

Sql server 将新行添加到MSSQL中的结果集,sql-server,pivot,Sql Server,Pivot,我正在MSSQL 2008 R2中运行一个SQL查询,该查询应始终返回一致的结果集,这意味着应显示选定日期范围内的所有日期,尽管数据库中没有日期范围内特定日期的行/值。例如,当id为1和2时,日期2013-07-03-2013-07-04应该是这样的 情景1 但是,如果id 2缺少2013-07-04的值,我通常只会得到如下结果集: 情景2 场景2将创建不一致的结果集,这将影响输出。是否有任何方法可以使SQL查询在缺少值的情况下始终作为场景1返回,因此,如果日期范围内没有特定日期的值,则至少返回

我正在MSSQL 2008 R2中运行一个SQL查询,该查询应始终返回一致的结果集,这意味着应显示选定日期范围内的所有日期,尽管数据库中没有日期范围内特定日期的行/值。例如,当id为1和2时,日期2013-07-03-2013-07-04应该是这样的

情景1

但是,如果id 2缺少2013-07-04的值,我通常只会得到如下结果集: 情景2

场景2将创建不一致的结果集,这将影响输出。是否有任何方法可以使SQL查询在缺少值的情况下始终作为场景1返回,因此,如果日期范围内没有特定日期的值,则至少返回NULL。如果结果集返回id 1和2,则应涵盖id 1和2的所有日期。如果返回id 1、2和3,则应涵盖id 1、2和3的所有日期

我有两张像这样的桌子:

tbl_measurement
    id, date, hour1, hour2, ..., hour24

tbl_plane
    planeId, id, maxSpeed
SELECT DISTINCT hour00_01, hour01_02, mr.date, mr.id, maxSpeed 
FROM tbl_measurement as mr, tbl_plane as p 
WHERE (date >= '2013-07-03' AND date <= '2013-07-04') AND p.id = mr.id 
GROUP BY mr.id, mr.date, hour00_01, hour01_02, p.maxSpeed
ORDER BY mr.id, mr.date 
我正在运行的SQL查询如下所示:

tbl_measurement
    id, date, hour1, hour2, ..., hour24

tbl_plane
    planeId, id, maxSpeed
SELECT DISTINCT hour00_01, hour01_02, mr.date, mr.id, maxSpeed 
FROM tbl_measurement as mr, tbl_plane as p 
WHERE (date >= '2013-07-03' AND date <= '2013-07-04') AND p.id = mr.id 
GROUP BY mr.id, mr.date, hour00_01, hour01_02, p.maxSpeed
ORDER BY mr.id, mr.date 

我一直在四处寻找,也许PIVOT表就是解决这个问题的方法?你能帮我一下吗?如果您能帮助我编写用于此目的的SQL查询,我将不胜感激。

您可以使用递归CTE生成日期列表。如果你将它与平面交叉连接,那么每个平面的每个日期都有一行。使用左连接,可以链接测量值(如果存在)。即使找不到度量值,左连接也将离开该行

例如:

declare @startDt date = '2013-01-01'
declare @endDt date = '2013-06-30'

; with  AllDates as
        (
        select  @startDt as dt
        union all
        select  dateadd(day, 1, dt)
        from    AllDates
        where   dateadd(day, 1, dt) <= @endDt
        )
select  *
from    AllDates ad
cross join
        tbl_plane p
left join
        (
        select  row_number() over (partition by Id, cast([date] as date) order by id) rn
        ,       *
        from    tbl_measurement
        where   m.inputType = 'forecast'
        ) m
on      p.Id = m.Id
        and m.date = ad.dt
        and m.rn = 1 -- Only one per day
where   p.planeType = 3
option  (maxrecursion 0)

当我运行这个查询时,我得到一个错误:必须声明标量变量@startDt。。我在哪里申报?我应该在哪里添加我的日期范围?这是否要与我当前的查询结合使用,我不确定我是否理解。运行查询时是否包含声明行?如果你喜欢的话,你可以用硬编码的值替换@startDt和@endDt。很好,它工作得很好,这也是我想要的。为了简单起见,我想对原始描述中遗漏的唯一一件事进行调整,就是对返回的值进行过滤,以便只包括p.planeType='3'和m.inputype='forecast'。我试图在…和m.date=ad.dt、p.planeType='3'和m.inputype='forecast'之后添加它,但它仍然返回所有行。还尝试了…和m.date=ad.dt,其中p.planeType='3'和m.inputype='forecast',但它不再起作用。在哪里可以添加此过滤?平面条件位于Where子句中。启用后,测量筛选进入联接条件。如果你把度量条件放在where子句中,你会过滤掉没有匹配度量值的日期。很好,它现在就应该工作了。谢谢你给了我一个很好的解决方案。