【问题标题】:SSRS Report/SQL Server: Display distinct column values even if there is no data on particular datesSSRS 报表/SQL Server:即使在特定日期没有数据,也显示不同的列值
【发布时间】:2021-03-01 22:23:23
【问题描述】:

我想为 SSRS 报告解决这个问题。我想显示@startdate 和@enddate 之间的所有日期。我已经完成了这部分。接下来,我想为不存在数据的日期显示不同的列值(对于名为“名称”的列)。 (即我生成的所有日期的 aa,bb)

我得到了什么:

Date name value
01/01/2021 00:00:00 no data no data
02/01/2021 00:00:00 no data no data
03/01/2021 00:00:00 aa 23
03/01/2021 00:01:00 bb 32
04/01/2021 00:00:00 aa 54
04/01/2021 00:01:00 bb 90

我想要什么:

Date name value
01/01/2021 00:00:00 aa no data
01/01/2021 00:00:00 bb no data
02/01/2021 00:00:00 aa no data
02/01/2021 00:00:00 bb no data
03/01/2021 00:00:00 aa 23
03/01/2021 00:01:00 bb 32
04/01/2021 00:00:00 aa 54
04/01/2021 00:01:00 bb 90

这是我的尝试:

DECLARE @STARTDATE DateTime
DECLARE @ENDDATE DateTime
SET @STARTDATE = '2021-01-01'
SET @ENDDATE = '2021-01-04'
;with dates ([Date]) as (
    Select convert(date,@STARTDate) as [Date] 
    union all 
    Select dateadd(day, 1, [Date])
    from dates
    where [Date] <= @ENDDATE 
)

select 
isnull(n.Created_Date,d.date) Date,
isnull(n.[NAME],'No Data') [NAME],
isnull(n.[VALUE],'No Data') [VALUE]
from dates d
left join Table_A n on convert(varchar, n.Created_Date, 101) = d.Date
where

([Created_Date] between (@StartDate) and (@EndDate) or
[Date] between (@StartDate-1) and (@EndDate) )
option (maxrecursion 32767)


任何帮助将不胜感激。

【问题讨论】:

  • 您可能会发现stackoverflow.com/questions/66324479/… 很有趣。顺便说一句:你真的不应该那样比较日期。如果要去掉时间部分,最好的方法是在 CTE 和 n.Created_Date &gt;= d.Date AND n.Created_Date &lt; d.nextDay 中添加 nextDay 列。另外你不应该使用date-1 而是使用dateadd(day, -1...
  • 我会记住的,谢谢!

标签: sql-server reporting-services ssrs-2012 ssrs-tablix


【解决方案1】:

我将这种模式称为“交叉连接、左连接”。您可以使用交叉连接来创建所有可能值的矩阵,然后使用左连接来填充可用值。

因此,您需要一个包含所有可能的Names 的表才能交叉加入。例如

DECLARE @STARTDATE DateTime
DECLARE @ENDDATE DateTime
SET @STARTDATE = '2021-01-01'
SET @ENDDATE = '2021-01-04'
;with dates ([Date]) as (
    Select convert(date,@STARTDate) as [Date] 
    union all 
    Select dateadd(day, 1, [Date])
    from dates
    where [Date] <= @ENDDATE 
), names as
(
  select distinct Name 
  from Table_A
)
select 
isnull(n.Created_Date,d.date) Date,
names.Name [NAME],
isnull(n.[VALUE],'No Data') [VALUE]
from dates
cross join names
left join Table_A n 
  on n.Created_Date = dates.Date
  and n.Name = names.Name
where dates.[Date] between dateadd(day,-1,@StartDate) and @EndDate 
option (maxrecursion 32767)

【讨论】:

    猜你喜欢
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 2012-01-17
    • 1970-01-01
    • 2019-07-02
    相关资源
    最近更新 更多