CREATE TABLE Test1
(
COL1 INT IDENTITY(1,1),
COL2 NVARCHAR(5)
)
INSERT INTO Test1
SELECT 'A'
UNION ALL
SELECT 'A'
UNION ALL
SELECT 'A'
UNION ALL
SELECT 'B'
UNION ALL
SELECT 'B'
이렇게 되었을때
결과가 이렇게 나왔으면 좋겠습니다..
우선 그냥 떠오르는거는
템프테이블에 넣고 커서돌려서 이전행을 변수에 넣고 현재행과 비교해서 템프테이블을 수정하는 방법인데..
너무 행단위처리라서 별로 맘에 안드는데...열단위로 어떻게 한방에 처리할방법없을까요 ㅠ
COL1 | COL2 |
1 | A |
2 | |
3 | |
4 | B |
5 |
Comment 3
-
쓸만한게없네(윤선식)
2013.04.24 01:27
-
메칸더
2013.04.24 15:00
CTE를 사용한 재귀쿼리 방식이네요
감사합니다 ㅎㅎ
-
원론
2013.04.25 10:37
IF OBJECT_ID('Test1') IS NOT NULLDROP TABLE Test1GOCREATE TABLE Test1(COL1 INT IDENTITY(1,1),COL2 NVARCHAR(5))GOINSERT INTO Test1SELECT 'A'UNION ALLSELECT 'A'UNION ALLSELECT 'A'UNION ALLSELECT 'B'UNION ALLSELECT 'B'GOSELECT * FROM Test1GOSELECT COL1, CASE WHEN row = 1 THEN COL2 ELSE '' END AS COL2FROM (SELECT ROW_NUMBER() OVER ( PARTITION BY COL2 ORDER BY COL1 ) AS row, *FROM Test1) aGO
이런 걸 원하시는 건지???
WITH TEST
AS
(
SELECT '1' AS COL1, 'A' AS COL2
UNION ALL
SELECT '2' AS COL1, 'A' AS COL2
UNION ALL
SELECT '3' AS COL1, 'A' AS COL2
UNION ALL
SELECT '4' AS COL1, 'B' AS COL2
UNION ALL
SELECT '5' AS COL1, 'B' AS COL2
)
SELECT
A.COL1,
CASE WHEN A.RN = 1 THEN A.COL2
WHEN A.COL2 = B.COL2 THEN ''
ELSE A.COL2 END AS COL2
FROM
(SELECT ROW_NUMBER() OVER (ORDER BY COL1) AS RN, COL1, COL2
FROM TEST) A LEFT JOIN
(SELECT ROW_NUMBER() OVER (ORDER BY COL1) AS RN, COL1, COL2
FROM TEST) B ON A.RN = B.RN + 1
원리는..
1. 재귀쿼리를 사용해서 테이블을 가져온 뒤 그 뒤의 ROW랑 조인하고요.. ROWNUMBER 를 각각 표시합니다.
2. 1번째 줄이면 무조건 COL2 표시합니다.
2번째 줄부터는 조인한 것과 비교해서 값이 같으면 공백으로 표시합니다.
만약, 두 값이 다를 경우 COL2 표시합니다.
SQL Server 2012부터는 LEAD, LAG 등을 사용해 구현이 가능합니다.