Как создать таблицу ежемесячного отчета с использованием запроса в хранимой процедуре 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 табличная переменная внутри хранимой процедуры. В тот момент, когда вы завершаете хранимую процедуру, эта табличная переменная исчезает. Если вы хотите, чтобы значения сохранялись постоянно, чтобы вы могли использовать их после завершения процедуры, вставьте их во (временную) таблицу. Смотрите, например, этот вопрос.

Другие вопросы по тегам