2013-06-24 3 views
1

나는 아래와 같이 데이터베이스에 테이블 고객을 보유하고 있습니다.두 번째 행에서 열 선택 ID에 의해 SQL 그룹에서 첫 번째 행의 끝에 추가

ID UID Address1 Name code 
10 5 A   Jac 683501 
11 5 B   Joe 727272 
13 6 C   mat 373737 

첫 번째 두 레코드 (10,11)는 공통 uID가 -5입니다. 이 두 레코드는 단일 단위로 간주 될 수 있습니다. , 제 레코드는 별도의 UID를 구비되므로 별도의 유닛

I CSV 파일에

ID UID Name code  Address1 Name2 Code2 
10 5 jac 683501 A   Joe 727272 
13 6 mat 373737 C 

NAME2 및 CODE2 값이 두 번째 행부터되는 방식을 출력을 생성해야

인 UID는 처음 두 레코드에서 동일하므로 단일 단위로 간주 할 수 있습니다.

누구나이 레코드를 생성하기위한 힌트를 제공 할 수 있습니까?

+0

[피벗] (http://msdn.microsoft.com/en-us/library/ms177410(v=sql.105) .aspx) . –

답변

2

행에서 열로 데이터를 변환하는이 프로세스를 PIVOT이라고합니다. 이 작업을 수행 할 수있는 몇 가지 방법이 있습니다.

당신은 CASE 식 집계 함수와 함께 row_number()를 사용할 수 있습니다

select min(id), 
    uid, 
    max(case when seq = 1 then name end) Name, 
    max(case when seq = 1 then code end) Code, 
    max(case when seq = 1 then Address1 end) Address1, 
    max(case when seq = 2 then name end) Name2, 
    max(case when seq = 2 then code end) code2, 
    max(case when seq = 2 then Address1 end) Address1_2 
from 
(
    select id, uid, address1, name, code, 
    row_number() over(partition by uid order by id) seq 
    from yourtable 
) d 
group by uid; 

SQL Fiddle with Demo을 참조하십시오.

select id, uid, 
    name1, code1, address1, name2, code2, address2 
from 
(
    select id, uid, col+cast(seq as varchar(10)) col, value 
    from 
    (
    select 
     (select min(id) 
     from yourtable t2 
     where t.uid = t2.uid) id, 
     uid, 
     cast(address1 as varchar(20)) address, 
     cast(name as varchar(20)) name, 
     cast(code as varchar(20)) code, 
     row_number() over(partition by uid order by id) seq 
    from yourtable t 
) d 
    unpivot 
    (
    value 
    for col in (address, name, code) 
) unpiv 
) src 
pivot 
(
    max(value) 
    for col in (name1, code1, address1, name2, code2, address2) 
) piv; 

SQL Fiddle with Demo를 참조하십시오

당신은 UNPIVOT과 PIVOT 기능을 모두 사용할 수 있습니다. 각 uid 값의 알 수없는 번호가있는 경우

마지막으로, 당신은 결과를 얻기 위해 동적 SQL을 사용할 수 있습니다

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT ',' + QUOTENAME(col+(cast(seq as varchar(10)))) 
        from 
        (
         select row_number() over(partition by uid order by id) seq 
         from yourtable 
        ) d 
        cross apply 
        (
         select 'name', 1 union all 
         select 'code', 2 union all 
         select 'address', 3 
        ) c (col, so) 
        group by seq, col, so 
        order by seq, so 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT id, uid,' + @cols + ' 
      from 
      (
       select id, uid, col+cast(seq as varchar(10)) col, value 
       from 
       (
        select 
        (select min(id) 
        from yourtable t2 
        where t.uid = t2.uid) id, 
        uid, 
        cast(address1 as varchar(20)) address, 
        cast(name as varchar(20)) name, 
        cast(code as varchar(20)) code, 
        row_number() over(partition by uid order by id) seq 
        from yourtable t 
       ) d 
       unpivot 
       (
        value 
        for col in (address, name, code) 
       ) unpiv 
      ) x 
      pivot 
      (
       max(value) 
       for col in (' + @cols + ') 
      ) p ' 

execute(@query); 

SQL Fiddle with Demo를 참조하십시오. 모든 버전의 결과는 다음과 같습니다.

| ID | UID | NAME1 | CODE1 | ADDRESS1 | NAME2 | CODE2 | ADDRESS2 | 
--------------------------------------------------------------------- 
| 10 | 5 | Jac | 683501 |  A | Joe | 727272 |  B | 
| 13 | 6 | mat | 373737 |  C | (null) | (null) | (null) | 
1

내부 결합을 시도하십시오.

select u2.firstname,u2.col2, 
from users u 
inner join users u2 on u.userid=u2.userid 
where u.firstname=u2.lastname 
+0

열을 대체하고 도움이 필요하면 알려주십시오. – bazz

+0

내부 결합이 작동하지 않는다고 생각합니다. 우리는 firstname과 결합 할 수 없습니다. – user1557886

+0

자체 결합이 작동하지 않습니다. – user1557886

관련 문제