2016-11-29 7 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

正しく理解場合@firstdateは、int型の変数であり、あなたはこれをインクリメントしたい場合は、単純なインクリメントロジックに必要があるため、この回線に問題

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

それはなかれ@firstdateを設定するには、2に等しいです。

は、あなたが「(一時的な)表」によって何を意味するのか明確にする必要が

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

関連する問題