Как создать таблицу ежемесячного отчета с использованием запроса в хранимой процедуре SQL Server?
Я хочу сделать такую таблицу (первый месяц до текущего месяца) в SQL Server:
Но я борюсь с запросом.
У меня есть запрос, который вставляется во временную таблицу с помощью хранимой процедуры, когда я выполняю хранимую процедуру, он продолжает выполнять запрос.
Это моя хранимая процедура:
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
2 ответа
Если все правильно, проблема с этой строкой
SET @firstdate = month(DATEADD(DAY,1,@firstdate))+1
это всегда установлено @firstdate
равно 2, так как @firstdate является переменной типа Int, и если вы хотите увеличить это значение, вам просто нужно просто увеличить логику.
Попробуйте заменить это на
SET @firstdate = @firstdate + 1
Вы объявляете @TEMP_TABLE
табличная переменная внутри хранимой процедуры. В тот момент, когда вы завершаете хранимую процедуру, эта табличная переменная исчезает. Если вы хотите, чтобы значения сохранялись постоянно, чтобы вы могли использовать их после завершения процедуры, вставьте их во (временную) таблицу. Смотрите, например, этот вопрос.