存储过程从一个 table 中获取日期范围并在另一个 table 中使用 WHERE 子句中的结果
Stored Procedure to take date range from one table and use the results in WHERE clause in another table
我正在尝试编写一个存储过程,它将从视图中获取 @start_dt
和 @end_dt
参数,并将它们用作另一个 [=34= 上的 WHERE
子句中的参数].
我正在尝试获取 @start_dt
和 @end_dt
之间的 HEATS 总数。然后我需要将此 SELECT
语句的结果插入 table.
如何在程序中声明 @start_dt
和 @end_dt
?我如何使用光标浏览每对 @start_dt
和 @end_dt
并在加热时进行计数?
此查询已完成一半:
CREATE PROCEDURE sp_EAF_HEAT_COUNT
AS
SELECT
@START_DT as START_DT,
@END_DT as END_DT,
COUNT(DISTINCT HEAT_ID) AS NUM_HEATS
FROM
[SSABDB].[L2].[EAF_HEAT]
WHERE
PROCESS_UNIT = 'EAFA'
AND START_DT > @START_DT
AND END_DT < @END_DT
INSERT INTO DASH.EAFA_HEAT_COUNT (START_DT, END_DT, FURNACE, NUM_HEATS)
VALUES (@START_DT, @END_DT, 'A', NUM_HEATS)
END
看代码应该是直接插入,不需要游标
例如:
CREATE PROCEDURE sp_EAF_HEAT_COUNT(@START_DT date, @END_DT date)
AS
BEGIN
INSERT
INTO DASH.EAFA_HEAT_COUNT
(START_DT
, END_DT
, FURNACE
, NUM_HEATS
)
SELECT MAX(b.START_DT)
, MAX(b.END_DT)
, COUNT(distinct HEAT_ID) as NUM_HEATS
FROM [SSABDB].[L2].[EAF_HEAT] a
JOIN dbo.EAFA_T b
ON a.START_DT > b.START_DT
AND a.END_DT < b.END_DT
WHERE a.PROCESS_UNIT = 'EAFA'
GROUP BY concat(convert(varchar(12),b.START_DT,101),'_',convert(varchar(12),b.END_DT,101))
END
再次根据评论更新!
还有一种方法。
CREATE PROCEDURE sp_EAF_HEAT_COUNT(@START_DT DATETIME, @END_DT DATETIME)
AS
BEGIN
--Finding Count
DECLARE @CNT_HEADID = (SELECT
SELECT Count(distinct HEAT_ID) as NUM_HEATS
FROM [SSABDB].[L2].[EAF_HEAT] where PROCESS_UNIT = 'EAFA'
AND START_DT > @START_DT and END_DT < @END_DT)
-- Inserting the Count
INSERT INTO DASH.EAFA_HEAT_COUNT (START_DT, END_DT, FURNACE, NUM_HEATS) VALUES (@START_DT, @END_DT, 'A', @CNT_HEADID)
END
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[spEAFA_HEAT_COUNT]
AS
BEGIN
DECLARE
@START_DT datetime
,@END_DT datetime
,@CNT_HEATS INT
DECLARE tblCursor CURSOR FOR
SELECT
START_DT , END_DT
FROM
dbo.EAFA_T
ORDER BY
END_DT
OPEN tblCursor
FETCH NEXT FROM tblCursor
INTO @START_DT, @END_DT
WHILE @@FETCH_STATUS = 0
BEGIN
select @CNT_HEATS = Count(distinct HEAT_ID)
FROM [DATABASENAME].[SCHEMANAME].[TABLENAME] where PROCESS_UNIT = 'EAFA'
AND START_DT > @START_DT and END_DT < @END_DT
INSERT INTO Dashboard.EAFA_HEAT_COUNT (START_DT, END_DT, FURNACE, NUM_HEATS) VALUES (@START_DT, @END_DT, 'A', @CNT_HEATS)
FETCH NEXT FROM tblCursor
INTO @START_DT, @END_DT
END
CLOSE tblCursor;
DEALLOCATE tblCursor;
END
GO
我正在尝试编写一个存储过程,它将从视图中获取 @start_dt
和 @end_dt
参数,并将它们用作另一个 [=34= 上的 WHERE
子句中的参数].
我正在尝试获取 @start_dt
和 @end_dt
之间的 HEATS 总数。然后我需要将此 SELECT
语句的结果插入 table.
如何在程序中声明 @start_dt
和 @end_dt
?我如何使用光标浏览每对 @start_dt
和 @end_dt
并在加热时进行计数?
此查询已完成一半:
CREATE PROCEDURE sp_EAF_HEAT_COUNT
AS
SELECT
@START_DT as START_DT,
@END_DT as END_DT,
COUNT(DISTINCT HEAT_ID) AS NUM_HEATS
FROM
[SSABDB].[L2].[EAF_HEAT]
WHERE
PROCESS_UNIT = 'EAFA'
AND START_DT > @START_DT
AND END_DT < @END_DT
INSERT INTO DASH.EAFA_HEAT_COUNT (START_DT, END_DT, FURNACE, NUM_HEATS)
VALUES (@START_DT, @END_DT, 'A', NUM_HEATS)
END
看代码应该是直接插入,不需要游标
例如:
CREATE PROCEDURE sp_EAF_HEAT_COUNT(@START_DT date, @END_DT date)
AS
BEGIN
INSERT
INTO DASH.EAFA_HEAT_COUNT
(START_DT
, END_DT
, FURNACE
, NUM_HEATS
)
SELECT MAX(b.START_DT)
, MAX(b.END_DT)
, COUNT(distinct HEAT_ID) as NUM_HEATS
FROM [SSABDB].[L2].[EAF_HEAT] a
JOIN dbo.EAFA_T b
ON a.START_DT > b.START_DT
AND a.END_DT < b.END_DT
WHERE a.PROCESS_UNIT = 'EAFA'
GROUP BY concat(convert(varchar(12),b.START_DT,101),'_',convert(varchar(12),b.END_DT,101))
END
再次根据评论更新!
还有一种方法。
CREATE PROCEDURE sp_EAF_HEAT_COUNT(@START_DT DATETIME, @END_DT DATETIME)
AS
BEGIN
--Finding Count
DECLARE @CNT_HEADID = (SELECT
SELECT Count(distinct HEAT_ID) as NUM_HEATS
FROM [SSABDB].[L2].[EAF_HEAT] where PROCESS_UNIT = 'EAFA'
AND START_DT > @START_DT and END_DT < @END_DT)
-- Inserting the Count
INSERT INTO DASH.EAFA_HEAT_COUNT (START_DT, END_DT, FURNACE, NUM_HEATS) VALUES (@START_DT, @END_DT, 'A', @CNT_HEADID)
END
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[spEAFA_HEAT_COUNT]
AS
BEGIN
DECLARE
@START_DT datetime
,@END_DT datetime
,@CNT_HEATS INT
DECLARE tblCursor CURSOR FOR
SELECT
START_DT , END_DT
FROM
dbo.EAFA_T
ORDER BY
END_DT
OPEN tblCursor
FETCH NEXT FROM tblCursor
INTO @START_DT, @END_DT
WHILE @@FETCH_STATUS = 0
BEGIN
select @CNT_HEATS = Count(distinct HEAT_ID)
FROM [DATABASENAME].[SCHEMANAME].[TABLENAME] where PROCESS_UNIT = 'EAFA'
AND START_DT > @START_DT and END_DT < @END_DT
INSERT INTO Dashboard.EAFA_HEAT_COUNT (START_DT, END_DT, FURNACE, NUM_HEATS) VALUES (@START_DT, @END_DT, 'A', @CNT_HEATS)
FETCH NEXT FROM tblCursor
INTO @START_DT, @END_DT
END
CLOSE tblCursor;
DEALLOCATE tblCursor;
END
GO