【问题标题】:SSRS 2008 Report Builder 3.0: Using CASE and WHEN FunctionSSRS 2008 Report Builder 3.0:使用 CASE 和 WHEN 函数
【发布时间】:2013-03-17 02:12:37
【问题描述】:

我的程序设置为允许用户选择一个电台,然后在 2 个日期之间进行选择,然后他们选择他们想要的班次。他们可以选择两者、第一或第二。第一个是上午 6:00 - 下午 4:00,第二个是下午 4:00 - 凌晨 3:00。我总共有4个参数。我认为我的程序没有返回第二班次的值,因为并非所有介于 16 和 3 之间的值都大于开始,小于结束。例如,下午 6:00 不小于 3 的结束时间,因此它不包含在输出中。我如何实现这一目标?这是我的代码:

DECLARE @StartHour INT
DECLARE @EndHour INT
SET @StartHour = CASE @TimeRange 

WHEN 0 THEN 0 --Start of Overall--
WHEN 1 THEN 6 --1st Shif Start--
WHEN 2 THEN 16 --2nd Shift Start--
END

SET @EndHour = CASE @TimeRange   
WHEN 0 THEN 24 --End of Overall--
WHEN 1 THEN 16 --End of First Shift--
WHEN 2 THEN 3 --End of Second Shift--
END

SELECT
Testerline1_CycleTimes.Station,
Testerline1_CycleTimes.StationEntry

WHERE
Testerline1_CycleTimes.Station LIKE @Station
AND Testerline1_CycleTimes.StationEntry Between @Start And @End
AND DATEPART( hh , Testerline1_CycleTimes.StationEntry ) >= @StartHour
AND DATEPART( hh , Testerline1_CycleTimes.StationEntry ) < @EndHour

【问题讨论】:

  • 我在这里没有看到问题,也没有看到有效的 SQL 脚本。 WHERE 子句有什么用?你有两个变量,怎么会以错误的顺序显示?
  • 我只复制了与我的问题相关的代码。它是报表生成器中使用的 T-SQL 代码,不确定这是否会有所不同。当我有这样的代码时,它不会返回案例 2 的值,它应该是下午 4:00 到凌晨 3:00。
  • 没有更多细节很难找出问题所在。也许用测试数据和整个查询设置一个 SQL Fiddle?
  • 如果您只考虑hours 部分,day 部分。这意味着如果下午 4 点和凌晨 3 点的处理方式不同。
  • 让我编辑我的原始问题并包含更多代码

标签: sql-server tsql ssrs-2008 reportbuilder3.0 case-when


【解决方案1】:

错过了最后一天的回答,但如果你还没有解决问题。我建议尝试将 union 用于您的第二班数据。随着日期的变化在时间范围之间进行选择

/*******************************************************
   --Commented Code
    DECLARE @StartHour INT
    DECLARE @EndHour INT
    SET @StartHour = CASE @TimeRange 

    WHEN 0 THEN 0 --Start of Overall--
    WHEN 1 THEN 6 --1st Shif Start--
    WHEN 2 THEN 16 --2nd Shift Start--
    END

    SET @EndHour = CASE @TimeRange   
    WHEN 0 THEN 24 --End of Overall--
    WHEN 1 THEN 16 --End of First Shift--
    WHEN 2 THEN 3 --End of Second Shift--
   END 
  *******************************************/

 If(@TimeRange=1)
 BEGIN
 SELECT
    Testerline1_CycleTimes.Station,
    Testerline1_CycleTimes.StationEntry
 WHERE
    sterline1_CycleTimes.Station LIKE @Station
    AND Testerline_CycleTimes.StationEntry Between @Start And @End
    AND DATEPART( hh , Testerline1_CycleTimes.StationEntry ) >= 6
    AND DATEPART( hh , Testerline1_CycleTimes.StationEntry ) < 16
END

ELSE IF(@TimeRange=2)
BEGIN
SELECT
   Testerline1_CycleTimes.Station,
   Testerline1_CycleTimes.StationEntry  
 WHERE
    Testerline1_CycleTimes.Station LIKE @Station
    AND Testerline1_CycleTimes.StationEntry Between @Start And @End
    AND DATEPART( hh , Testerline1_CycleTimes.StationEntry ) >= 16
UNION ALL
SELECT
     Testerline1_CycleTimes.Station,
     Testerline1_CycleTimes.StationEntry
WHERE
    Testerline1_CycleTimes.Station LIKE @Station
    AND Testerline1_CycleTimes.StationEntry Between @Start And @End
    AND DATEPART( hh , Testerline1_CycleTimes.StationEntry ) < 3
END

 ELSE
 BEGIN
 SELECT
      Testerline1_CycleTimes.Station,
      Testerline1_CycleTimes.StationEntry
 WHERE
     Testerline1_CycleTimes.Station LIKE @Station
     AND Testerline1_CycleTimes.StationEntry Between @Start And @End
 END

【讨论】:

  • 完美运行!非常感谢,我已经尝试解决这个问题 2 周了!
  • 这适用于第二个班次,但后来它使我的第一个班次值完全错误。我什至无法在输出值中找到模式。
  • 虽然真正的问题是指在检索第二班数据时的疑问,我试图通过union 解释,但您不能使用相同的查询来检索其他结果,因此请使用相同的条件语句。更新了我的答案。如果您仍然遇到任何问题,请告诉我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多