,하지만 당신은 문자열로 데이터를 연결할 수 있습니다 :
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
을 칼럼의 크기는 일대 다 테이블의 세로 크기에 달려있다. Im 정적 인 것은 없다. ery는 결과를 출력하지만, 당신은 프로그래밍 적으로 @Roman과 같은 쿼리를 생성하여이 결과를 출력 할 수 있습니다. –
Roman의 피벗 솔루션을 사용해 보겠습니다. 데이터를 문자열로 변경하는 것이 최선의 방법은 아닙니다. – kufer
또한 단지 설명하기 위해 .. 열의 수가 정적입니다. 테이블 StockItemCatSearchValueShort에서 1 ItemID는 항상 4 개의 SearchValueID를가집니다. – kufer