SQL 질문과 답변 게시판
Microsoft SQL Server와 관련된 질문과 답변을 올리는 게시판입니다. 궁금하신 내용을 이곳에서 문의하시면 SQLER 분들의 답변을 받으실 수 있습니다. 문의를 하실때에는 최근 작업하신 특이 사항이나, 장애 발생 전 상황을 상세히 올려 주시면 답글을 적어주시는 SQLER분들의 답변이 더 정확할 수 있으니 도움 되시길 바랍니다. 쿼리 문의일 경우, 실제 문제가 재현되는 테이블생성, 샘플데이터 생성 쿼리를 함께 올려 주시면 더 빠르고 정확한 쿼리 문의 응답이 가능합니다.
글 수 5,175
2010.02.04 00:55:54 (*.18.215.106)
(추천 수:
2 / 0)
IF OBJECT_ID('TBLX') IS NOT NULL
DROP TABLE TBLX
GO
CREATE TABLE TBLX
(IDX INT
,VALS VARCHAR(2047))
GO
INSERT INTO TBLX VALUES (1, '1/2')
INSERT INTO TBLX VALUES (2, '1/2/3/4/5/6/7/8/9/10')
INSERT INTO TBLX VALUES (3, '1')
GO
SELECT A.IDX, SUM(CAST(SUBSTRING(A.VALS,B.S,B.E-B.S) AS INT)) VAL
FROM TBLX A
CROSS APPLY (
SELECT TOP (2047) NUMBER S
, CHARINDEX('/',A.VALS+'/',NUMBER + 1) E
FROM MASTER.DBO.SPT_VALUES
WHERE NUMBER = CHARINDEX ('/','/'+A.VALS,NUMBER)
AND TYPE ='P'
ORDER BY NUMBER) B
GROUP BY A.IDX
WITH ROLLUP

차주언

재미있는 함수(parsename)이용방법이 있네요..최석준님
with numT
as(
select 1 num union all
select 2 num union all
select 3 num union all
select 4 num -- / 배열 4개까지만 지원 한답니다...
-- 문제는 소수점이 있는 수치에서는 한번더 replace 사용해야함.. ),
test
as(
select '1' no union all
select '1/2' no union all
select '10/0/1' no union all
select '0/13/1/4' no )
select r.no , sum(convert(int,r.num)) sum_num
from ( select a.no
, isnull(parsename(replace(a.no,'/','.') ,b.num ) ,0) num
From test a cross join numT b ) r
group by r.no
with rollup
- 결과
no sum_num
0/13/1/4 18
1 1
1/2 3
10/0/1 11
NULL 33