안녕하세요.
mssql 질문입니다.
1>3
1>3>12
1>3>12>16
1>3>12>20
1>3>12>20>8
1>3>12>21
1>3>13
1>3>14
1>3>15
1>3>15>11
1>3>15>2
1>3>15>2>9
숫자들 만 뽑아내려고 합니다.
단순히 SUBSTRING 을 사용하면 자리수 때문에.....문제가 있더군요.
(추가)
현재 한개의 컬럼에 들어가 있는 값을 숫자들만으로 된 컬럼으로 뽑아내려고 합니다
1>3>12>20>8 ==> 1, 3, 12, 20, 8
1>3>15>2>9 ==> 1, 3, 15, 2, 9
위에서 4번째 값이 자릿수가 다르다보니 단순 substring()으로 해결이 안됩니다
SELECT
SUBSTRING(SORT,1,1) AS sort1
, SUBSTRING(SORT,3,1) AS sort2
, SUBSTRING(SORT,5,2) AS sort3
, SUBSTRING(SORT,8,2) AS sort4
, SUBSTRING(SORT,11,2) AS sort5
통계쿼리를 작성하려고 합니다.
grouping_id를 얻기 위해 파싱이 필요한데...아직 아이디어 수준입니다.
하위값이 있으면 소계가 필요합니다.
3은 전체합
12는 자신을 포함한 하위 4개행 합
20은 자신을 포함한 하위 1개행 합
15는 자신을 포함한 하위 2개행 합
WITH t AS ( SELECT '1>3' v UNION ALL SELECT '1>3>12' UNION ALL SELECT '1>3>12>16' UNION ALL SELECT '1>3>12>20' UNION ALL SELECT '1>3>12>20>8' UNION ALL SELECT '1>3>12>21' UNION ALL SELECT '1>3>13' UNION ALL SELECT '1>3>14' UNION ALL SELECT '1>3>15' UNION ALL SELECT '1>3>15>11' UNION ALL SELECT '1>3>15>2' UNION ALL SELECT '1>3>15>2>9' ) SELECT v , SUBSTRING(v, 0+1, a-0-1) v1 , SUBSTRING(v, a+1, b-a-1) v2 , SUBSTRING(v, b+1, c-b-1) v3 , SUBSTRING(v, c+1, d-c-1) v4 , SUBSTRING(v, d+1, e-d-1) v5 FROM (SELECT v , CHARINDEX('>', x, 1) a , CHARINDEX('>', x , CHARINDEX('>', x) + 1) b , CHARINDEX('>', x , CHARINDEX('>', x , CHARINDEX('>', x) + 1) + 1) c , CHARINDEX('>', x , CHARINDEX('>', x , CHARINDEX('>', x , CHARINDEX('>', x) + 1) + 1) + 1) d , CHARINDEX('>', x , CHARINDEX('>', x , CHARINDEX('>', x , CHARINDEX('>', x , CHARINDEX('>', x) + 1) + 1) + 1) + 1) e FROM (SELECT v, CONCAT(v, '>>>>>') x FROM t) a ) a ;
좀 더 간결한 구문도 가능합니다.
다만, 행을 늘렸다가, 다시 줄이는 과정이 포함되다보니.
이런 과정이 없는 좀 더 복잡한 구문을 선택했습니다.
SELECT * FROM t CROSS APPLY OPENJSON(REPLACE(CONCAT('[', v, ']'), '>', ',')) a PIVOT (MIN(value) FOR [key] IN ([0], [1], [2], [3], [4])) a ; SELECT v , MIN(CASE [key] WHEN 0 THEN value END) v1 , MIN(CASE [key] WHEN 1 THEN value END) v2 , MIN(CASE [key] WHEN 2 THEN value END) v3 , MIN(CASE [key] WHEN 3 THEN value END) v4 , MIN(CASE [key] WHEN 4 THEN value END) v5 , MIN(CASE [key] WHEN 5 THEN value END) v6 FROM t CROSS APPLY OPENJSON(REPLACE(CONCAT('[', v, ']'), '>', ',')) a GROUP BY v ;