2016-11-29 1 views
1

나는 SQL 서버에서 (현재 월까지 첫 달)과 같은 테이블을 만들고 싶어 :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 타입 변수이기 때문에 @firstdate, 2로 동일하고 당신이 증가 할 경우 단순한 증가 로직에 필요한 설정이 줄

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

에 문제가 있습니다.

당신은 당신이 "는 (일시적으로) 테이블"무슨 뜻인지 명확히 할 필요가

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

관련 문제