2017-12-10 9 views
0

나는 SQL 서버 2014를 사용하고 난 Table1으로 데이터베이스에 저장된 다음과 같은 출력을 반환하는 T-SQL 쿼리가 : 나는 다음과 같은 논리를 갖는 T-SQL 쿼리를 작성해야이 테이블의 값을 특정 논리에 따라 특정 형식으로 변환하는 방법은 무엇입니까?

Id  AdultCount Adult1Age C1-5 C6-12 C13-17 
--------------------------------------------------- 
101  2   45   1  0  0 
102  1   36   0  0  0 
103  2   40   0  2  1 

를 :

  1. Adult1Age은 성인 1 명을 제공합니다. 성인 1 명 이상인 경우 남은 성인은 기존 Adult1Age에서 2를 뺀 (즉, ID 101의 경우 다른 성인은 Age = 45-2 = 43 임)

  2. C1-5, C6-12, C13-17은 각 연령대의 자녀 수를 제공합니다. 즉, C1-5은 1 ~ 5 세 사이의 아동 수를 나타냅니다. 카테고리의 하한과 상한을 사용하여 자녀의 평균 연령 (중간 점)을 계산합니다. 따라서 C1-5 아래에 1이있는 경우 해당 어린이는 Age = (1 + 5)/2 = 3이됩니다.

    ID 103을 보면 9 세 1 명의 자녀가 2 명 있다는 것을 의미합니다. 15 세 아이. 나는이 가야합니까 어떻게

    Id  Age 
    ---------- 
    101 45 
    101 43 
    101  3 
    102 36 
    103 40 
    103 38 
    103  9 
    103  9 
    103 15 
    

    :

지금, 나는 다음과 같은 출력을 반환 표 1에서 실행되는 T-SQL 쿼리를해야합니까?

답변

0

는 다음을 실행

declare @tab table (Id int, AdultCount int, AdultAge int, [C1-5] int, [C6-12] int, [C13-17] int) 
insert into @tab 
select 101,2,45,1,0,0 
union 
select 102,1,36,0,0,0 
union 
select 103,2,40,0,2,1 

select * from @tab 

declare @t table (Id int) 
insert into @t select distinct Id from @tab 

while ((select count(1) from @t) > 0) 
begin 
    declare @Id int = (select top 1 Id from @t) 
    declare @age_tab table (Id int, Age int) 
    declare @cage1 smallint = 3, @cage2 smallint = 9, @cage3 smallint = 15 
    declare @i_a int = (select AdultCount from @tab where Id = @Id) 
    declare @i_c1 int = (select [C1-5] from @tab where Id = @Id) 
    declare @i_c2 int = (select [C6-12] from @tab where Id = @Id) 
    declare @i_c3 int = (select [C13-17] from @tab where Id = @Id) 
    declare @age int = (select AdultAge from @tab where Id = @Id) 

    while (@i_a>1) 
    begin 
     insert into @age_tab select @Id, (@age - 2) 
     set @age-=2 
     set @i_a-=1 
    end 

    while (@i_c1>0) 
    begin 
     insert into @age_tab select @Id, @cage1 
     set @i_c1-=1 
    end 
    while (@i_c2>0) 
    begin 
     insert into @age_tab select @Id, @cage2 
     set @i_c2-=1 
    end 
    while (@i_c3>0) 
    begin 
     insert into @age_tab select @Id, @cage3 
     set @i_c3-=1 
    end 
    insert into @age_tab select Id, AdultAge from @tab where Id = @Id 

    delete @t where Id = @Id 
end 

select * from @age_tab 
order by Id, age desc 

HTH를!

감사합니다.

+0

좋아요! 고마워요! – user3115933