【问题标题】:How to make a monthly report table using query in SQL Server stored procedure?如何在 SQL Server 存储过程中使用查询制作月报表?
【发布时间】:2017-04-12 22:22:10
【问题描述】:

我想在 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

【问题讨论】:

    标签: sql-server tsql stored-procedures temp-tables


    【解决方案1】:

    如果理解正确,这行有问题

    SET @firstdate = month(DATEADD(DAY,1,@firstdate))+1
    

    它总是设置 @firstdate 等于 2,因为 @firstdate 是 Int 类型变量,如果你想增加它,你只需要简单的增加逻辑。

    尝试将其替换为

    SET @firstdate = @firstdate + 1
    

    【讨论】:

    • 是的,你理解正确:-)。执行SELECT DATEADD(DAY,1,1); 会返回1900-01-08 00:00:00.000,这应该有助于解释问题。
    【解决方案2】:

    您在存储过程中声明了 @TEMP_TABLE 表值变量。结束存储过程的那一刻,这个表值变量就消失了。如果您希望永久存储这些值,以便在过程完成后使用它们,请将它们插入(临时)表中。参见例如this question.

    【讨论】:

    • 您需要澄清“(临时)表”的含义。一个真正的临时表 (#tablename) 的作用域是当前存储过程,并且在它终止时将被删除 - 与表变量没有什么不同。
    猜你喜欢
    • 2022-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    相关资源
    最近更新 更多