안녕하세요,
컬럼에 데이터가 아래와 같이 있습니다.
---------------
컬럼 a
--------------
100||200||300
100||200
300
"||"구분자로 구분하여 갯수를 세고 싶습니다.
100의 관련된것은 3개
200의 관련된것은 3개
이런식으로요..
어떤식으로 해야 하나요??
고수님들의 답변 기다리고 있겠습니다.
답변이 없네요.
저는 예제대로 이 문제를 해결할까 말까를 고민했는데
우선 로직부터 말씀드리죠.
1) temp table을 만듦 (칼럼에는 data하나만 들갈수 있는)
2) ||를 검색하여 없으면 temp table에 삽입
있으면 단어를 분리하여 temp_tabe에 삽입
3) 2의 과정을 다 마쳤다면 counting하여 버리면 됩니다.
너무 성의 없는 답변이죠 ^^
곧 예제 하나 만들어 보죠
/*
--여긴 확인 사살 및 Data 입력create table tempTb (idx int identity(1,1),aa varchar(50))--drop table tempTb
insert into tempTb values ('100||200||300')insert into tempTb values ('100||200')insert into tempTb values ('300')insert into tempTb values ('100||200||300')insert into tempTb values ('100||200||300||400')select * from tempTb*/
여기가 실구문입니다.
declare @tstr varchar(100), @i int, @tsql varchar(5000), @k int
create table #tbTemp(aa varchar(50))
set @k = 1while exists (select aa from tempTb where idx = @k)Begin select @tstr=aa from tempTb where idx = @k select @i = charindex('||', @tstr) if @i > 0 begin while @i > 0 begin insert into #tbTemp values(left(@tstr, charIndex('||', @tstr)-1)) select @tstr = substring(@tstr, charindex('||', @tstr) + 2, len(@tstr)) select @i = charindex('||' , @tstr) end select @tsql = left(@tsql, len(@tsql)-2) insert into #tbTemp values (@tstr) end else insert into #tbTemp values(@tstr)
set @k = @k + 1End
select aa, count(aa) as cnt from #tbTemp group by aaorder by aa
drop table #tbTemp
--결과의 모습은 아래와 같습니다.
aa cnt------------------------------ -----------100 4200 4300 4400 1
(4 row(s) affected)
FUNCTION 이용 해봤습니다.create table #A (col varchar(1000))
insert #A select '100||200||300'
create FUNCTION FUN_SJR_1 (@InEmpId varchar(100))RETURNS int asBEGIN declare @retuncnt int set @retuncnt = 0 while 0 <> charindex('||',@InEmpId) begin set @InEmpId = substring( @InEmpId, charindex('||',@InEmpId)+2,len( @InEmpId)) set @retuncnt = @retuncnt +1 end RETURN (@retuncnt)END
SELECT col, dbo.FUN_SJR_1(col) from #A