2017-04-05 50 views
2

我正在獲取具有以下格式的數據文件。我必須得到一個儲存有物品描述的表格。如何在我的TSQL中替換union ALL

我正在尋找與CategoryID,商品代碼和商品描述的輸出。由於所有項目的數據都在相同的行中,因此類別變得有點棘手。

CategoryID Name ItemCode1 ItemCode2 ItemCode3 ItemCode4 ItemCode5 
    1  Test1 1234578  87BA1234     ERR12345 
    2  Test2 BAAA9AAJ    143PAAM 

ItemDescription存儲如下:

Itemcode  ItemDesc 
12345678  Item1 
87BA1234  Item2 
and so on 

我能夠通過分別選擇每個項目,說明得到我想要的輸出,並與工會一切束縛他們。但我覺得應該有更好的方法來做到這一點。感謝您的指導。

編輯:我的T-SQL與UNION ALL

SELECT CategoryID, isnull(Item.ItemDescription, 'Unknown') as ItemDesc 
      FROM 
      (
       SELECT CategoryID, ItemCode1 as code 
       FROM ItemDesc 
       UNION ALL  --AAAE9AAF 
       SELECT CategoryID, ItemCode2 as code 
       FROM ItemDesc 
       UNION ALL  --AAAG9AAF 
       SELECT CategoryID, ItemCode3 as code 
       FROM ItemDesc 
       UNION ALL  
       SELECT CategoryID, ItemCode4 as code 
       FROM ItemDesc 
       UNION ALL  
       SELECT CategoryID, ItemCode5 as code 
       FROM ItemDesc 
      )tc 
      LEFT JOIN @ItemDescription Item ON Item.ItemCode = tc.code 
+0

你是否介意發佈你的查詢。 –

+0

你能告訴我們你正在運行的實際t-sql命令,它裏面有聯合嗎?也許這只是我,但你的描述沒有太多意義。你是說item_description在另一個表中嗎? categoryID是外鍵還是外鍵的一部分?基本上我要求更多的解釋。謝謝。 –

+0

其中是您的輸出中的「description」。請提供樣本數據和預期產出。 – Utsav

回答

5

如果我的理解對不對,你想UNPIVOT您的數據。

嘗試使用CROSS APPLY

select 
    t.categoryId, 
    x.itemcode, 
    d.itemDesc 
from your_table t 
cross apply (
    values (t.itemcode1),(t.itemcode2),(t.itemcode3), 
      (t.itemcode4),(t.itemcode5) 
    ) x (itemcode) 
join ItemDescription d on x.itemcode = d.itemcode; 
+0

這應該工作。但是OP需要在做出改變之前先檢查兩件事情,首先它返回相同的結果,其次它表現得比原始更好或更好。這些都是您在使用其他方法重寫某些內容時需要做的事情。 – HLGEM

+0

@GurV這工作。非常感謝你! – Ramya

2

使用cross apply()values()

select 
    t.CategoryId 
    , t.Name 
    , v.ItemCode 
from t 
cross apply (values (ItemCode1), (ItemCode2), (ItemCode3), (ItemCode4), (ItemCode5) 
) v (ItemCode) 
where isnull(ItemCode,'') <> '' 

rextester演示:http://rextester.com/TFPP48713

回報:

+------------+-------+----------+ 
| CategoryId | Name | ItemCode | 
+------------+-------+----------+ 
|   1 | Test1 | 1234578 | 
|   1 | Test1 | 87BA1234 | 
|   1 | Test1 | ERR12345 | 
|   2 | Test2 | BAAA9AAJ | 
|   2 | Test2 | 143PAAM | 
+------------+-------+----------+ 
+0

感謝您的快速回復。如果我能接受這兩個答案,我也可以接受這個答案。對不起! – Ramya

+0

@Ramya不用擔心,樂意幫忙! – SqlZim