WEB/MSSQL

[MSSQL] 특정 배수만큼 ROW생성 SELECT 쿼리

인생시계 2020. 12. 24. 15:45

[MSSQL] 특정 배수만큼 ROW생성 SELECT 쿼리

5의 배수만큼 ROW를 SELECT하는 쿼리


WITH TEMP_A AS
(
    SELECT '1반' AS [반정보], '일월~' AS [이름], 1 AS [번호]
     UNION ALL
    SELECT '1반' AS [반정보], 'Feb!' AS [이름], 2 AS [번호]
     UNION ALL
    SELECT '1반' AS [반정보], '3월@' AS [이름], 3 AS [번호]
     UNION ALL
    SELECT '1반' AS [반정보], '사월#' AS [이름], 4 AS [번호]
     UNION ALL
    SELECT '2반' AS [반정보], 'May$' AS [이름], 5 AS [번호]
     UNION ALL
    SELECT '2반' AS [반정보], '6월%' AS [이름], 6 AS [번호]
     UNION ALL
    SELECT '2반' AS [반정보], '칠월~' AS [이름], 7 AS [번호]
     UNION ALL
    SELECT '2반' AS [반정보], 'Aug!' AS [이름], 8 AS [번호]
     UNION ALL
    SELECT '3반' AS [반정보], '9월@' AS [이름], 9 AS [번호]
     UNION ALL
    SELECT '3반' AS [반정보], '십월*' AS [이름], 10 AS [번호]
     UNION ALL
    SELECT '3반' AS [반정보], 'Nov&' AS [이름], 11 AS [번호]
     UNION ALL
    SELECT '3반' AS [반정보], '12월^' AS [이름], 12 AS [번호]
)
, TEMP_B AS
(
    SELECT ROW_NUM        AS ROW_NUM
              , CASE WHEN ROW_NUM = CNT 
                           THEN MAX_ROW              
                             ELSE ROW_NUM             
                  END                  AS MAX_ROW  
              , [반정보]               AS [반정보]
              , [이름]                   AS [이름]
      FROM (
            SELECT ROW_NUMBER() OVER(ORDER BY [번호])                          AS ROW_NUM
                       , COUNT(*) OVER(PARTITION BY NULL)                                AS CNT
                       , (CEILING((COUNT(*)OVER(PARTITION BY NULL))/5.0)*5) AS MAX_ROW -- 5의 배수로 진행
                       , [반정보]                                                                                   AS [반정보]
                       , [이름]                                                                                       AS [이름]
              FROM TEMP_A
                  ) TEMP_BA
     UNION ALL
    SELECT ROW_NUM+1 AS ROW_NUM
               , MAX_ROW   AS MAX_ROW
               , NULL      AS [반정보]
               , NULL      AS [이름]
      FROM TEMP_B
     WHERE 1=1
          AND ROW_NUM+1 <= MAX_ROW
)

SELECT *
  FROM TEMP_B

위의 쿼리 실행 결과(5의 배수)