2015-05-19 31 views
1

我有一個Excel工作表,看起來下面給出:如何使用多個值被分成幾行一列裝載到表

+---------+----------------+ 
| ItemNum | Substitutes | 
+---------+----------------+ 
| ABCD | XXXX/YYYY/ZZZZ | 
| PQRS | AAAA/BBBB/CCCC | 
+---------+----------------+ 

我需要這個加載到在MS Access表或SQL Server中的採用以下方法:

+---------+------------+ 
| ItemNum | Substitute | 
+---------+------------+ 
| ABCD | XXXX  | 
| ABCD | YYYY  | 
| ABCD | ZZZZ  | 
| PQRS | AAAA  | 
| PQRS | BBBB  | 
| PQRS | CCCC  | 
+---------+------------+ 

請注意一種方式來做到這一點。我知道有一種方法可以使用Excel VBA執行此操作。但是我正在尋找無宏的選項,其中文件可以加載到臨時表中,然後使用SQL以所需的形式獲得。

+4

'但是我正在尋找無宏的選項'爲什麼用'Excel-VBA'來標記它:)然後我刪除了標籤。如果您對VBA開放,那麼請重新添加標籤並從帖子中刪除該行 –

+0

「替代品」列中的值總是3個值? – chancea

+0

此外,這些值總是4個字符或不同的長度? – clesiemo3

回答

3

導入數據作爲,那麼你可以使用此查詢到他們拆了下來:

SELECT T1.ItemNum, T2.mySplits as Substitute 
FROM 
(
    SELECT *, 
    CAST('<X>'+replace(T.Substitutes,'/','</X><X>')+'</X>' as XML) as my_Xml 
    FROM Table1 T 
) T1 
CROSS APPLY 
( 
SELECT my_Data.D.value('.','varchar(50)') as mySplits 
FROM T1.my_Xml.nodes('X') as my_Data(D) 
) T2 

下面是一個SQL小提琴:http://sqlfiddle.com/#!6/042da/2

+1

我喜歡這個答案。它甚至適用於奇怪的數據輸入,例如'AAAA1234/BBBBxx/CCCCd // SSSS'。它正確地放入空值,並不關心我的長度或數字,因爲它是一個varchar。 – clesiemo3

+0

謝謝約翰非常強大的解決方案。正如clesiemo3所提到的,它對於不同的投入是非常靈活的。我應該在問題中提到這一點,但儘管名稱遵循標準,但我們在數據中有一些異常值。這將很好地處理它們。我想深入瞭解這個查詢。請讓我知道我可以在哪裏閱讀這個查詢的工作原理。 – Manus

+0

嗨馬努斯。我在這裏讀了BOL:https://msdn.microsoft.com/en-us/library/ms187339.aspx。它相當深入並且清楚地解釋了一切。然後看看各種博客。這裏有大量的在線例子。 –

3

你應該採取一個臨時表的方法。因爲你有這個標記爲SQL Server和Access,這裏有兩個選項。

如果您知道代碼總是相同的長度,然後把數據放到一個臨時表,並用類似提取:

select ItemNum, substring(substitutes, 1, 4) as substitute 
from staging 
where substitutes is not null 
union all 
select ItemNum, substring(substitutes, 6, 4) as substitute 
from staging 
where substitutes like '%/%' 
union all 
select ItemNum, substring(substitutes, 10, 4) as substitute 
from staging 
where substitutes like '%/%/%' 

等。這是故意編寫的,可以很容易地修改爲在MS Access中運行。

第二種選擇是類似的,但在Excel中做了旋轉。使用數據 - >文本到列將數據拆分爲單獨的列。然後,將它們加載到列表中,如substitute1等。然後您想要一個查詢,如:

select ItemNum, substitute1 as substitute 
from staging 
where substitute1 is not null 
union all 
select ItemNum, substitute2 as substitute 
from staging 
where substitute2 is not null 
union all 
select ItemNum, substitute3 as substitute 
from staging 
where substitute3 is not null 

再次,此查詢是有意寫入與SQL Server和MS Access兼容。

+0

謝謝戈登。對於大多數測試用例,您的答案已足夠。但是這些數據中有一些異常值使我與約翰貝爾的解決方案一致。 – Manus

1

上面有一個SQL查詢用於導入,應該是首選的方法。如果您想在工作表中嘗試基於公式的解決方案,請嘗試使用此公式對。

Split with formula

爲D2的公式:E2是,在必要時

=OFFSET($A$2, INT((ROW(1:1)-1)/3),0) 
=MID(OFFSET($A$2, INT((ROW(1:1)-1)/3), 1), MOD((ROW(1:1)-1)*5+1,15), 4) 

向下填充。這可能是一次性解決方案。

+0

謝謝您的寶貴意見。它可以工作,但我對這個問題的SQL解決方案更感興趣。 – Manus

相關問題