년월 | 정산사업장 |
201501 | A |
201502 | A |
201503 | A |
201504 | B |
201505 | B |
201506 | B |
201507 | A |
201508 | A |
201509 | C |
201510 | C |
201511 | C |
201512 | C |
시작년월 종료년월 정산사업장
201501 201503 A
201504 201506 B
201507 201508 A
201509 201512 C
위의 테이블에서 아래와 같은 조회결과를 얻고 싶은데 어떤식으로 표현해야하나요???
Comment 3
-
짱나부러
2015.07.30 18:05
-
joe
2015.09.16 15:06
with aa as (
select '201501' col1, 'A' col2 union all
select '201502' col1, 'A' col2 union all
select '201503' col1, 'A' col2 union all
select '201504' col1, 'B' col2 union all
select '201505' col1, 'B' col2 union all
select '201506' col1, 'B' col2 union all
select '201507' col1, 'A' col2 union all
select '201508' col1, 'A' col2 union all
select '201509' col1, 'C' col2 union all
select '201510' col1, 'C' col2 union all
select '201511' col1, 'C' col2 union all
select '201512' col1, 'C' col2
)
, bb as ( -- 연속행의 시작은 시작월, 종료는 종료월을 열로 취득
select top 100000000
aa.*
, case when col2<> isnull(lag(col2,1) over(order by col1,col2),'')
then col1
else ''
end min1
, case when col2 <> isnull(lead(col2,1) over(order by col1,col2),'')
then col1
else ''
end max1
from aa
order by 1
)
,cc as (
select bb.*
, case when max1 = ''
then lead(max1,1) over(order by col1,col2)
else max1
end groupkey --짝수행이 종료이므로 종료로 group key 생성
from bb
where min1 <> '' or max1 <> '' -- 시작이나 종료행만 취득
)
select max(min1) 시작년월
, max(max1) 종료년월
, col2 정산사업장
from cc
group by col2,groupkey -- 그룹핑
-- 1.연속행의 시작은 시작월, 종료는 종료월을 열로 취득
-- 2.시작이나 종료행만 취득
-- 3.짝수행이 종료이므로 종료로 group key 생성
-- 4.그룹핑 -
건우아빠
2015.09.16 18:21
--http://www.sqler.com/138840
with aa as (
select '201501' col1, 'A' col2 union all
select '201502' col1, 'A' col2 union all
select '201503' col1, 'A' col2 union all
select '201504' col1, 'B' col2 union all
select '201505' col1, 'B' col2 union all
select '201506' col1, 'B' col2 union all
select '201507' col1, 'A' col2 union all
select '201508' col1, 'A' col2 union all
select '201509' col1, 'C' col2 union all
select '201510' col1, 'C' col2 union all
select '201511' col1, 'C' col2 union all
select '201512' col1, 'C' col2
)
select MIN(col1) [시작년월], MAX(col1) [종료년월] , COUNT(*) [개월수] , col2 [정산사업장]
from (
select col2
, col1
, ROW_NUMBER() over ( partition by col2 order by col1 ) idx
, DATEDIFF( mm, col1+'01', getdate() ) no
from aa
) r
group by col2, idx + no
order by MIN(col1) , col2, idx + no desc
움.... group by 값을 만들어야 할텐데.... 루프를 돌리는데 문제가 없는 상황이라면.......
짧은 지식이라 조인으로 해결을 못하겠습니다... ㅠ,.ㅠ
--//변수 선언
declare @cnt int = 1;
declare @totCnt int;
declare @구분 int = 0;
declare @사업장 nvarchar(10);
declare @이전사업장 nvarchar(10);
declare @table table
(
num int identity(1,1)
, 년월 int
, 사업장 nvarchar(10)
, 구분 tinyint
);
;with test (년월, 사업장) as
(
select 201501, 'A' union all
select 201502, 'A' union all
select 201503, 'A' union all
select 201504, 'B' union all
select 201505, 'B' union all
select 201506, 'B' union all
select 201507, 'A' union all
select 201508, 'A' union all
select 201509, 'C' union all
select 201510, 'C' union all
select 201511, 'C' union all
select 201512, 'C'
)
insert into @table (년월, 사업장)
select 년월, 사업장
from test;
set @totCnt = @@ROWCOUNT;
while @cnt <= @totCnt begin
if (@cnt = 1) begin
set @사업장 = (select 사업장 from @table where num = @cnt);
update @table
set 구분 = @구분
where num = @cnt;
end
else begin
set @이전사업장 = @사업장;
set @사업장 = (select 사업장 from @table where num = @cnt);
if (@사업장 <> @이전사업장) begin
set @구분 += 1;
update @table
set 구분 = @구분
where num = @cnt;
end
else begin
update @table
set 구분 = @구분
where num = @cnt;
end
end
set @cnt += 1;
end
select min(년월) as 시작, max(년월) as 종료, 사업장
from @table
group by 구분, 사업장