Sql 添加高级过滤器(参数)选项
有一个记录仪表读数的数据库,其中记录了小时值添加了。并包含三个参数: 一天 时辰 月 下面的过程工作正常,但我想再添加几个参数: -上午7点到下午7点的白班 -晚上7点到早上7点的夜班 我将非常感谢您的帮助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
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