MSSQL PIVOT NULL 처리 0 3 2,745

by 고재원 [SQL Query] [2023.04.18 09:25:03]


00.gif (86,555Bytes)

/* PIVOT COLUMNS */
DECLARE @COLUMNS NVARCHAR(MAX)
DECLARE @SQL     NVARCHAR(MAX)

SET @COLUMNS = ''

SELECT @COLUMNS = @COLUMNS + '[' + uName + '],'
  FROM (
         SELECT uName
           FROM LABORCOSTS 
       ) AS months
 ORDER BY uName

SET @COLUMNS = LEFT(@COLUMNS, LEN(@COLUMNS) - 1)
/* PIVOT COLUMNS */

SET @SQL = '
            select *
                from (
                        select orderno, ordernm,amt, gsname from #pivot
                     ) as result
                PIVOT (
                        SUM(amt) FOR gsname IN (' + @COLUMNS + ')
                      ) as pivot_result
            order by orderno
        '
    EXEC(@SQL)

 

여기서 NULL 일 경우 0으로 넣고 싶어요

아래처럼 해 봤는데 안되네요..

SUM(isnull(amt,0)) FOR gsname IN (' + @COLUMNS + ')  X

SUM(amt) FOR gsname IN (' + ISNULL(@COLUMNS,0) + ') X

 

현재 결과는 첨부파일 처럼 표시 됩니다.

 

by 마농 [2023.04.18 10:38:50]
-- 1. 피벗 전에 데이터 부풀리기

SET @SQL = 'SELECT *
              FROM (SELECT a.orderno
                         , a.ordernm
                         , b.gsname
                         , ISNULL(c.amt, 0) amt
                      FROM (SELECT DISTINCT orderno, ordernm FROM #pivot) a
                     CROSS JOIN laborcosts b
                      LEFT OUTER JOIN #pivot c
                        ON a.orderno = c.orderno
                       AND b.gsname  = c.gsname
                    ) AS result
             PIVOT (SUM(amt) FOR gsname IN (' + @COLUMNS + ')) AS pivot_result
             ORDER BY orderno
            '

 


by 고재원 [2023.04.18 10:59:42]

감사합니다. 잘 됩니다.


by 마농 [2023.04.18 11:05:52]
-- 2. 피벗 대신 SUM(CASE) 사용하기

/* SELECT_LIST COLUMNS */
DECLARE @COLUMNS NVARCHAR(MAX)
DECLARE @SQL     NVARCHAR(MAX)

SET @COLUMNS = ''

SELECT @COLUMNS = @COLUMNS
                + ', ISNULL(SUM(CASE gsname WHEN ''' + uName + ''' THEN amt END), 0) AS ' + uName
  FROM (
         SELECT uName
           FROM LABORCOSTS 
       ) AS months
 ORDER BY uName

SET @COLUMNS = LEFT(@COLUMNS, LEN(@COLUMNS) - 1)
/* PIVOT COLUMNS */

SET @SQL = 'SELECT orderno
                 , ordernm
               ' + @COLUMNS + '
              FROM #pivot
             GROUP BY orderno, ordernm
             ORDER BY orderno
            '
EXEC(@SQL)

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입