2013-08-24 95 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

您的號碼的列取決於你的一對多表的垂直大小,我怕我沒有一個靜態曲輸出結果的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可以g 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