2016-11-29 114 views
1

我要作出這樣一個表(第一個月,直到當月)在SQL Server:如何使用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 

回答

1

如果理解正確的話,這條線

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

它送花兒給人設定@firstdate等於2,因爲@firstdate是int型變量,如果你想增加這一點,你只需要簡單的增量邏輯問題。

嘗試用

SET @firstdate = @firstdate + 1 
+1

是的,你理解正確:-)。做'SELECT DATEADD(DAY,1,1);'返回'1900-01-08 00:00:00.000',這應該有助於解釋這個問題。 –

0

您在聲明存儲過程中您@TEMP_TABLE表值變量。當你結束存儲過程時,這個表值變量消失。如果您希望持續存儲值,以便在過程完成後使用它們,請將它們插入(臨時)表中。見例如this question

+0

你需要澄清你所說的「一個(臨時)表」的意思替換此。真正的臨時表('#tablename')被限定在當前的存儲過程中,並在終止時被刪除 - 與表變量沒有區別。 – alroc

相關問題