2013-08-24 4 views
4

다른 JOIN 쿼리를 시도하고 있지만 찾고있는 결과를 얻지 못하고 있습니다.여러 행을 하나의 행으로 결합

내가 2 개 테이블을 가지고 :

Table 1: **StockItemShort**  

ItemID | Code   | Name  
432724 | CK002-16-09 | Green Daisy Pearl Earrings 
432759 | CK002-16-149 | Emerald Crystal Centre Daisy Earrings 

Table 2: **StockItemCatSearchValueShort** 

ItemID | SearchValueID 
432724 | 388839 
432724 | 389061 
432724 | 390269 
432724 | 389214 
432759 | 388839 
432759 | 389051 
432759 | 390269 
432759 | 389214 

나는 내가 찾고 결과를 얻을 수 없습니다.

나는 결과 다음과 같은 좀하고 싶습니다 : 당신은 같은 칼럼의 동적 수를 가질 수 없습니다

ItemID | Code | Name | SearchValueID | SearchValueID | SearchValueID | SearchValueID 
432724 | CK002-16-09 | Green Daisy Pearl Earrings | 388839 | 389061 | 390269 | 389214 
432759 | CK002-16-149 | Emerald Crystal Centre Daisy Earrings | 388839 | 389051 | 390269 | 389214 
+0

을 칼럼의 크기는 일대 다 테이블의 세로 크기에 달려있다. Im 정적 인 것은 없다. ery는 결과를 출력하지만, 당신은 프로그래밍 적으로 @Roman과 같은 쿼리를 생성하여이 결과를 출력 할 수 있습니다. –

+0

Roman의 피벗 솔루션을 사용해 보겠습니다. 데이터를 문자열로 변경하는 것이 최선의 방법은 아닙니다. – kufer

+0

또한 단지 설명하기 위해 .. 열의 수가 정적입니다. 테이블 StockItemCatSearchValueShort에서 1 ItemID는 항상 4 개의 SearchValueID를가집니다. – kufer

답변

6

,하지만 당신은 문자열로 데이터를 연결할 수 있습니다 :

select 
    s.ItemID, s.Code, s.Name, 
    stuff(
     (
      select ', ' + CAST(sv.SearchValueID AS VARCHAR) 
      from ItemSearch as sv 
      where sv.ItemID = s.ItemID 
      for xml path(''), type 
     ).value('.', 'nvarchar(128)') 
    , 1, 2, '') as SearchValues 
from Item as s; 

또는 피벗 행PIVOT command 또는 수동으로 (나는 후자의 접근 방식을 선호합니다, 그것은 단지 나를 위해 더 유연하게 보이지만, pivot 수 있습니다 reatly) 특정 상황에서 코드의 양을 줄일 :

with cte as (
    select 
     *, 
     row_number() over(partition by sv.ItemID order by sv.SearchValueID) as row_num 
    from ItemSearch as sv 
) 
select 
    s.ItemID, s.Code, s.Name, 
    max(case when sv.row_num = 1 then sv.SearchValueID end) as SearchValueID1, 
    max(case when sv.row_num = 2 then sv.SearchValueID end) as SearchValueID2, 
    max(case when sv.row_num = 3 then sv.SearchValueID end) as SearchValueID3, 
    max(case when sv.row_num = 4 then sv.SearchValueID end) as SearchValueID4 
from Item as s 
    inner join cte as sv on sv.ItemID = s.ItemID 
group by s.ItemID, s.Code, s.Name 

또한이 같은 동적 SQL로 이전 문을 설정할 수 있습니다 : 전화 번호 한 번

declare @stmt nvarchar(max) 

select 
    @stmt = 
     isnull(@stmt + ',','') + 
     'max(case when sv.row_num = ' + cast(rn as nvarchar(max)) + 
     ' then sv.SearchValueID end) as SearchValueID' + cast(rn as nvarchar(max)) 
from (
    select distinct row_number() over(partition by ItemID order by SearchValueID) as rn 
    from ItemSearch 
) as a 

select @stmt = ' 
    with cte as (
     select 
      *, 
      row_number() over(partition by sv.ItemID order by sv.SearchValueID) as row_num 
     from ItemSearch as sv 
    ) 
    select 
     s.ItemID, s.Code, s.Name,' + @stmt + ' 
    from Item as s 
     inner join cte as sv on sv.ItemID = s.ItemID 
    group by s.ItemID, s.Code, s.Name;' 

exec dbo.sp_executesql @stmt = @stmt 

sql fiddle demo

+0

열 수는 정적입니다. – kufer

+0

테이블 StockItemCatSearchValueShort에서 1 ItemID는 항상 4 SearchValueID입니다. – kufer

+1

답변 해 주셔서 고맙습니다. 피벗 솔루션에 대한 코드를 SQLFiddle에 붙여 넣을 때 다음 오류가 발생합니다. 키워드 'order'근처의 구문이 잘못되었습니다. – kufer

관련 문제