Sql 添加高级过滤器(参数)选项

Sql 添加高级过滤器(参数)选项,sql,sql-server,reporting-services,Sql,Sql Server,Reporting Services,有一个记录仪表读数的数据库,其中记录了小时值​​添加了。并包含三个参数: 一天 时辰 月 下面的过程工作正常,但我想再添加几个参数: -上午7点到下午7点的白班 -晚上7点到早上7点的夜班 我将非常感谢您的帮助 CREATE PROCEDURE [ElCounters_by_Machines] -- Add the parameters for the stored procedure here @dtStart datetime, @dtEnd datetime, @dtPeriod nvar

有一个记录仪表读数的数据库,其中记录了小时值​​添加了。并包含三个参数:

一天

时辰

下面的过程工作正常,但我想再添加几个参数:

-上午7点到下午7点的白班

-晚上7点到早上7点的夜班

我将非常感谢您的帮助

CREATE PROCEDURE [ElCounters_by_Machines]
-- Add the parameters for the stored procedure here
@dtStart datetime,
@dtEnd datetime,
@dtPeriod nvarchar(10)
AS
BEGIN
  SET NOCOUNT ON;
  SELECT
    CONVERT(varchar(16), DATEADD(mi, CASE
      WHEN DATEPART(mi, [DT]) > 30 THEN 60 - DATEPART(mi, [DT])
      ELSE -DATEPART(mi, [DT])
    END, [DT]), 121) AS DT,
    Tag AS Name,
    Value INTO #Sel
  FROM tblCounters
  WHERE DT BETWEEN DATEADD(MINUTE, -20, @dtStart) AND DATEADD(MINUTE, 1445, @dtEnd)

  CREATE TABLE #t (
    DT datetime,
    Name nvarchar(150),
    Value float(2)
  )
  IF @dtPeriod = 'Day'

  BEGIN
    INSERT INTO #t
      SELECT
        DT,
        Name,
        Value
      FROM #Sel
      WHERE CAST(DT AS time) = '00:00'
  END

  ELSE
  IF @dtPeriod = 'Hour'

  BEGIN
    INSERT INTO #t
      SELECT
        DT,
        Name,
        Value
      FROM #Sel
  END

  ELSE
  IF @dtPeriod = 'Month'

  BEGIN
    INSERT INTO #t
      SELECT
        DT,
        Name,
        Value
      FROM #Sel
      WHERE DATEPART(DAY, DT) = '1'
      AND CAST(DT AS time) = '00:00'
  END

  DROP TABLE #Sel

  SELECT
    ROW_NUMBER() OVER (ORDER BY DT) AS Rw,
    DT,
    Value AS FF01 INTO #t01
  FROM #t
  WHERE Name LIKE '%elFF01.P'

  SELECT
    DT,
    Value AS FF03 INTO #t02
  FROM #t
  WHERE Name LIKE '%elFF03.P'

  SELECT
    DT,
    Value AS FF04 INTO #t03
  FROM #t
  WHERE Name LIKE '%elFF04.P'

  SELECT
    DT,
    Value AS FF06 INTO #t04
  FROM #t
  WHERE Name LIKE '%elFF06.P'

  SELECT
    DT,
    Value AS FF07 INTO #t05
  FROM #t
  WHERE Name LIKE '%elFF07.P'

  SELECT
    DT,
    Value AS FF09 INTO #t06
  FROM #t
  WHERE Name LIKE '%elFF09.P'

  SELECT
    _01.Rw, _01.DT, FF01, FF03, FF04, FF06, FF07, FF09 INTO #t100
  FROM #t01 _01

  LEFT JOIN #t02 _02  ON _01.DT = _02.DT
  LEFT JOIN #t03 _03  ON _01.DT = _03.DT
  LEFT JOIN #t04 _04  ON _01.DT = _04.DT
  LEFT JOIN #t05 _05  ON _01.DT = _05.DT
  LEFT JOIN #t06 _06  ON _01.DT = _06.DT
  
  SELECT
    * INTO #t200
  FROM #t100
  SELECT 
    _100.DT,
    ROUND((_200.FF01 - _100.FF01), 0) AS FF01,
    ROUND((_200.FF03 - _100.FF03), 0) AS FF03,
    ROUND((_200.FF04 - _100.FF04), 0) AS FF04,
    ROUND((_200.FF06 - _100.FF06), 0) AS FF06,
    ROUND((_200.FF07 - _100.FF07), 0) AS FF07,
    ROUND((_200.FF09 - _100.FF09), 0) AS FF09 INTO #t300 
  FROM #t100 _100
  JOIN #t200 _200
    ON _200.Rw = _100.Rw + 1
  ORDER BY DT
  SELECT
    *
  FROM #t300
  ORDER BY DT

  DROP TABLE #t, #t01, #t02, #t03, #t04, #t05, #t06, #t100, #t200, #t300

END
GO
另一种报告形式,其中有一个类似的过滤器:

我希望在生成报告时看到以下参数选择:

一,。白班

二,。夜班

三,。时辰

四,。一天

五,。月

预期结果:

将不同报告中使用的两个单独的参数合并到一个或正确的查询中,以便从头编写以显示值​​对于选定的参数

以下是带有日期、月份、小时参数的可用报告表格:

以下是包含所有白天和夜间参数的可用报告表格:


样本数据和预期结果将有助于我们在这方面为您提供帮助。您的问题是如何向报告中添加白班和夜班参数,还是如何构造查询?这些参数的预期值和数据类型是什么?听起来您只需要一个名为shift的附加参数,该参数的值为'D'和'N',但很难组合在一起。。。另外,如果小时-日-月可以选择一个小时范围,那么白天和夜晚参数应该做什么?一个最小的数据集在本地运行会有很大帮助。哇,这是一些非常神秘的代码。我跟着它走了一段时间,但它只是融化了我的大脑。
CREATE PROCEDURE [ElCounters_by_Machines]
-- Add the parameters for the stored procedure here
@dtStart datetime,
@dtEnd datetime,
@dtPeriod nvarchar(10)
AS
BEGIN
  SET NOCOUNT ON;
  SELECT
    CONVERT(varchar(16), DATEADD(mi, CASE
      WHEN DATEPART(mi, [DT]) > 30 THEN 60 - DATEPART(mi, [DT])
      ELSE -DATEPART(mi, [DT])
    END, [DT]), 121) AS DT,
    Tag AS Name,
    Value INTO #Sel
  FROM tblCounters
  WHERE DT BETWEEN DATEADD(MINUTE, -20, @dtStart) AND DATEADD(MINUTE, 1445, @dtEnd)

  CREATE TABLE #t (
    DT datetime,
    Name nvarchar(150),
    Value float(2)
  )
  IF @dtPeriod = 'Day'

  BEGIN
    INSERT INTO #t
      SELECT
        DT,
        Name,
        Value
      FROM #Sel
      WHERE CAST(DT AS time) = '00:00'
  END

  ELSE
  IF @dtPeriod = 'Hour'

  BEGIN
    INSERT INTO #t
      SELECT
        DT,
        Name,
        Value
      FROM #Sel
  END

  ELSE
  IF @dtPeriod = 'Month'

  BEGIN
    INSERT INTO #t
      SELECT
        DT,
        Name,
        Value
      FROM #Sel
      WHERE DATEPART(DAY, DT) = '1'
      AND CAST(DT AS time) = '00:00'
  END

  DROP TABLE #Sel

  SELECT
    ROW_NUMBER() OVER (ORDER BY DT) AS Rw,
    DT,
    Value AS FF01 INTO #t01
  FROM #t
  WHERE Name LIKE '%elFF01.P'

  SELECT
    DT,
    Value AS FF03 INTO #t02
  FROM #t
  WHERE Name LIKE '%elFF03.P'

  SELECT
    DT,
    Value AS FF04 INTO #t03
  FROM #t
  WHERE Name LIKE '%elFF04.P'

  SELECT
    DT,
    Value AS FF06 INTO #t04
  FROM #t
  WHERE Name LIKE '%elFF06.P'

  SELECT
    DT,
    Value AS FF07 INTO #t05
  FROM #t
  WHERE Name LIKE '%elFF07.P'

  SELECT
    DT,
    Value AS FF09 INTO #t06
  FROM #t
  WHERE Name LIKE '%elFF09.P'

  SELECT
    _01.Rw, _01.DT, FF01, FF03, FF04, FF06, FF07, FF09 INTO #t100
  FROM #t01 _01

  LEFT JOIN #t02 _02  ON _01.DT = _02.DT
  LEFT JOIN #t03 _03  ON _01.DT = _03.DT
  LEFT JOIN #t04 _04  ON _01.DT = _04.DT
  LEFT JOIN #t05 _05  ON _01.DT = _05.DT
  LEFT JOIN #t06 _06  ON _01.DT = _06.DT
  
  SELECT
    * INTO #t200
  FROM #t100
  SELECT 
    _100.DT,
    ROUND((_200.FF01 - _100.FF01), 0) AS FF01,
    ROUND((_200.FF03 - _100.FF03), 0) AS FF03,
    ROUND((_200.FF04 - _100.FF04), 0) AS FF04,
    ROUND((_200.FF06 - _100.FF06), 0) AS FF06,
    ROUND((_200.FF07 - _100.FF07), 0) AS FF07,
    ROUND((_200.FF09 - _100.FF09), 0) AS FF09 INTO #t300 
  FROM #t100 _100
  JOIN #t200 _200
    ON _200.Rw = _100.Rw + 1
  ORDER BY DT
  SELECT
    *
  FROM #t300
  ORDER BY DT

  DROP TABLE #t, #t01, #t02, #t03, #t04, #t05, #t06, #t100, #t200, #t300

END
GO
cross apply (
    select
       datediff(hour,'20180101 07:00', dt) % 24 hr) ca1
cross apply (
    select 
      case
          when  ca1.hr between 0  and 11 then 'D'
          when  ca1.hr between 12 and 23 then 'N'
          end as shift, 
          convert(varchar(13),dateadd(hour,-(case when hr < 12 then hr else hr-12 end),dt),121) shift_start) ca2
;

if @dtPeriod = 'Day' 
begin 
 insert into #t600 select * from #t500 where shift = 'D'
end

if @dtPeriod = 'Night'
begin 
  insert into #t600 select * from #t500 where shift = 'N'
end