如何使用 SQL 服务器存储过程中的查询制作月度报告 table?
How to make a monthly report table using query in SQL Server stored procedure?
我想在 SQL 服务器中创建这样的 table(第一个月到当前月份):
但我正在为查询而苦苦挣扎。
我有一个使用存储过程插入临时 table 的查询,当我执行存储过程时,它会继续执行查询。
这是我的存储过程:
ALTER PROCEDURE [dbo].[get_dashboard_bulan]
@month int,
@year int
AS
SET DATEFORMAT DMY
SET NOCOUNT ON
BEGIN
DECLARE @TEMP_TABLE TABLE (bulan int,
NOA int,
OSPENGAJUAN money,
OSDISETUJUI money,
NOABANDING int)
DECLARE @firstdate INT = 1,
@datenow INT= month ((select DATEADD(day, -1, DATEADD(month, @Month, DATEADD(year, @Year - 1900, 0))))),
@NOA INT = 0,
@OSPENGAJUAN MONEY = 0,
@OSDISETUJUI MONEY = 0,
@NOABANDING INT = 0
BEGIN TRY
IF @month = MONTH(GETDATE()) AND @year = YEAR(GETDATE())
BEGIN
SET @datenow = MONTH(GETDATE())
END
WHILE @firstdate <= @datenow
BEGIN
SET @NOA = (SELECT COUNT(tiket_id)
FROM m_tiket
WHERE MONTH(created_at) = @firstdate)
SET @OSPENGAJUAN = (SELECT SUM(plafond) AS plafond
FROM m_tiket
WHERE MONTH(created_at) = @firstdate)
SET @OSDISETUJUI = (SELECT SUM(plafond_disetujui) AS plafond_disetujui
FROM m_tiket
WHERE MONTH(created_at) = @firstdate)
SET @NOABANDING = (SELECT COUNT(tiket_id)
FROM m_track
WHERE status_id = 10 AND MONTH(created_at) = @firstdate)
INSERT INTO @TEMP_TABLE
VALUES (@firstdate, @NOA, @OSPENGAJUAN, @OSDISETUJUI, @NOABANDING);
SET @firstdate = month(DATEADD(DAY,1,@firstdate))+1
END
END TRY
BEGIN CATCH
END CATCH
END
SELECT
bulan, noa,
IIF(ospengajuan IS NULL, 0, ospengajuan) AS ospengajuan,
IIF(osdisetujui IS NULL, 0, osdisetujui) AS osdisetujui,
noabanding
FROM
@TEMP_TABLE
您正在存储过程中声明 @TEMP_TABLE
table 值变量。一旦您结束存储过程,这个 table 值的变量就会消失。如果您希望持久存储这些值,以便您可以在过程完成后使用它们,请将它们插入(临时)table。参见例如this question.
如果理解正确,这行有问题
SET @firstdate = month(DATEADD(DAY,1,@firstdate))+1
它总是设置 @firstdate
等于 2,因为 @firstdate 是 Int 类型变量,如果你想增加它,你只需要简单的增加逻辑。
尝试将其替换为
SET @firstdate = @firstdate + 1
我想在 SQL 服务器中创建这样的 table(第一个月到当前月份):
但我正在为查询而苦苦挣扎。
我有一个使用存储过程插入临时 table 的查询,当我执行存储过程时,它会继续执行查询。
这是我的存储过程:
ALTER PROCEDURE [dbo].[get_dashboard_bulan]
@month int,
@year int
AS
SET DATEFORMAT DMY
SET NOCOUNT ON
BEGIN
DECLARE @TEMP_TABLE TABLE (bulan int,
NOA int,
OSPENGAJUAN money,
OSDISETUJUI money,
NOABANDING int)
DECLARE @firstdate INT = 1,
@datenow INT= month ((select DATEADD(day, -1, DATEADD(month, @Month, DATEADD(year, @Year - 1900, 0))))),
@NOA INT = 0,
@OSPENGAJUAN MONEY = 0,
@OSDISETUJUI MONEY = 0,
@NOABANDING INT = 0
BEGIN TRY
IF @month = MONTH(GETDATE()) AND @year = YEAR(GETDATE())
BEGIN
SET @datenow = MONTH(GETDATE())
END
WHILE @firstdate <= @datenow
BEGIN
SET @NOA = (SELECT COUNT(tiket_id)
FROM m_tiket
WHERE MONTH(created_at) = @firstdate)
SET @OSPENGAJUAN = (SELECT SUM(plafond) AS plafond
FROM m_tiket
WHERE MONTH(created_at) = @firstdate)
SET @OSDISETUJUI = (SELECT SUM(plafond_disetujui) AS plafond_disetujui
FROM m_tiket
WHERE MONTH(created_at) = @firstdate)
SET @NOABANDING = (SELECT COUNT(tiket_id)
FROM m_track
WHERE status_id = 10 AND MONTH(created_at) = @firstdate)
INSERT INTO @TEMP_TABLE
VALUES (@firstdate, @NOA, @OSPENGAJUAN, @OSDISETUJUI, @NOABANDING);
SET @firstdate = month(DATEADD(DAY,1,@firstdate))+1
END
END TRY
BEGIN CATCH
END CATCH
END
SELECT
bulan, noa,
IIF(ospengajuan IS NULL, 0, ospengajuan) AS ospengajuan,
IIF(osdisetujui IS NULL, 0, osdisetujui) AS osdisetujui,
noabanding
FROM
@TEMP_TABLE
您正在存储过程中声明 @TEMP_TABLE
table 值变量。一旦您结束存储过程,这个 table 值的变量就会消失。如果您希望持久存储这些值,以便您可以在过程完成后使用它们,请将它们插入(临时)table。参见例如this question.
如果理解正确,这行有问题
SET @firstdate = month(DATEADD(DAY,1,@firstdate))+1
它总是设置 @firstdate
等于 2,因为 @firstdate 是 Int 类型变量,如果你想增加它,你只需要简单的增加逻辑。
尝试将其替换为
SET @firstdate = @firstdate + 1