代码之家  ›  专栏  ›  技术社区  ›  hendraspt

如何在SQL Server存储过程中使用查询生成月报表?

  •  1
  • hendraspt  · 技术社区  · 8 年前

    我想在SQL Server中创建这样的表(从第一个月到当前月份):

    enter image description here

    但我在质疑这个问题。

    我有一个使用存储过程插入临时表的查询,当我执行存储过程时,它会继续执行查询。

    这是我的存储过程:

    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 回复  |  直到 8 年前
        1
  •  1
  •   Jaydip Jadhav    8 年前

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

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

    尝试将此替换为

    SET @firstdate = @firstdate + 1
    
        2
  •  0
  •   Community c0D3l0g1c    7 年前

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