>

가변 행을 열로 변환 해야하는 이상한 요구 사항이 있습니다. 이것이 SQL로 수행 될 수 있는지 또는 다른 언어로 프로그램을 작성해야하는지 알아내는 데 도움이 필요합니다.

최소한 클라이언트 데이터 만 보유하고있는 클라이언트 테이블이 있다고 가정하자. 그런 다음 속성이라는 테이블에서 가능한 다른 속성 (예 : 전화 번호, 주소 등)의 이름을 지정합니다. 마지막으로 두 번째 FK와 값을 보유하는 세 번째 테이블 인 ClientAttributes가 있습니다.

각 클라이언트마다 여러 개의 속성이 있습니다. 클라이언트는 0, 1 또는 무한 전화 번호, 0, 1 또는 무한 주소 등을 가질 수 있습니다.

필요한 것은 모든 해당 데이터의 테이블 뷰입니다. 클라이언트 이름, 전화, 전화 2, 전화 3, ..., 주소, 주소 2, 주소 3. 등. 클라이언트에 그러한 값이 없으면 값은 null입니다. 분명히 이것은 쿼리가 실행될 때마다 열의 수가 다를 수 있음을 의미합니다.

SQL Server 2008과 호환되어야합니다.

이것은 T-SQL에서 순수하게 수행 될 수 있습니까? 아니면 데이터를 덤프하고 C #에서 처리하도록 클라이언트 측에서해야합니까? C #에서 쉽게 할 수는 있지만 SQL 에서이 작업을 수행 할 수 있는지 확실하지 않습니다. 데이터 세트가 너무 커서 RAM에 맞지 않기 때문에 SQL이 선호됩니다.

  • 답변 # 1

    필요한 경우 동적 SQL을 통해 SQL로 수행 할 수 있습니다. 하나의 항목 (전화 사용)에 대한 기본 이론은 다음과 같습니다. 원하는 열 그룹 별로이 작업을 반복합니다. 아무도 예쁘다고 말하지 않을 것입니다.

    유효한 모든 전화 번호에 대해 클라이언트 ID, 전화를받는 기본 쿼리 (CTE, TEMP 테이블 등)를 작성하십시오. "ROW_NUMBER () OVER (PARTITION BY ClientID ORDER BY (무엇))"행 번호 추가-나는 그것을 근거로 부를 것이다

    basedata에서 최대 row_number 가져 오기-필요한 전화 열 수

    i = 1에서 MaxRowNo로 반복하여 동적 SQL 쿼리 문자열의 일부를 만듭니다. 각 루프에서 선택 문자열과 결합 문자열을 만듭니다. 선택 문자열은 각 루프에 다음과 같은 것을 추가해야합니다

    Set @SelectStr = @SelectStr + 'P' + cast(i as varchar(10)) + '.Phone,';
    
    

    결합 문자열은 각 루프에 이와 같은 것을 추가해야합니다

    Set @JoinStr = @JoinStr + ' left outer join baseData P' + cast(i as varchar(10)) + ' on P' + cast(i as varchar(10)) + '.ClientID = C.ClientID and P' + cast(i as varchar(10)) + '.RowNo = ' + cast(i as varchar(10));
    
    

    주소와 다른 반복되는 열 그룹에 대해 위의 전체 과정을 반복합니다. 별칭 이름을 두 배로 늘리지 마십시오. 그런 다음 고정적이고 변경되지 않은 쿼리 부분 (클라이언트 데이터)을 추가하여 최종 동적 SQL 쿼리를 구성합니다.

    Set @FinalQuery = 'SELECT C.ClientID, C.ClientName, ' + @SelectStr + ' From Client C ' + @JoinStr
    
    

    최종의 빌드 쿼리 (예를 들어 최대 3 개의 전화와 2 개의 주소가 있다고 가정)는 다음과 같습니다-그런 다음이 문자열을 실행하십시오

    SELECT C.ClientID, C.ClientName, --any other client stuff you need here
       P1.Phone, P2.Phone, P3.Phone, A1.Address, A2.Address
    From Client C
       left outer join baseData P1 on P1.ClientID = C.ClientID and P1.RowNo = 1
       left outer join baseData P2 on P2.ClientID = C.ClientID and P2.RowNo = 2
       left outer join baseData P3 on P3.ClientID = C.ClientID and P3.RowNo = 3
       left outer join baseAddr A1 on A1.ClientID = C.ClientID and A1.RowNo = 1
       left outer join baseAddr A2 on A2.ClientID = C.ClientID and A2.RowNo = 2
    
    

관련 자료

  • 이전 R에서 희소 행렬 만들기
  • 다음 c# - 다른 마크로 문자열 분리