2013-12-10 62 views
0

我有一個csv,我將它帶入SQL表中。 csv在CrimeType中有一個字段。該字段是管道分隔的。所以,我使用的交叉應用,打破了管道,就像這樣:csv中管道分隔字段內記錄的索引號

SELECT CrimeRecords.CaseNum, CrimeRecords.Offense, PrimaryCrime.PrimaryCrime 
FROM (SELECT CaseNum ,x.i.value('.','varchar(20)') AS Offense 
      FROM (SELECT CaseNum, CONVERT(XML,'<i>'+REPLACE(CrimeType, '|', '</i><i>') + '</i>') AS d 
         FROM CrimeView.dbo.tblCrimeData)x1 CROSS APPLY d.nodes('i') AS x(i)) AS CrimeRecords 

有人可以幫我補充一個步驟,以創建一個字段的序列號?基本上我只想返回管道中物品的順序。

對於像行:

1, Burglary|Assault 
2, Burglary 
3, Assault|Assault-Weapon|Theft 

我的結果表是這樣的:

CaseNum  CrimeType  SeqNum 
1   Burglary   1 
1   Assault   2 
2   Burglary   1 
3   Assault   1 
3   Assault-Weapon 2 
3   Theft   3 

編輯以表明該序列號重置每個CaseNum。

編輯標籤以澄清這是Microsoft SQL,而不是MySQL。

+0

表中的序列字段(ID)是否足夠用於該目的? –

+0

@AlexisWilke我需要與CaseNum相關的數字。所以對於CaseNum#2,SeqNum需要重新開始1. – sernst

+0

啊!您可能想要進行編輯以清楚地顯示序列號每次重置... –

回答

2

嘗試在你的SELECT語句(http://technet.microsoft.com/en-us/library/ms186734.aspx)包括ROW_NUMBER()函數。

SELECT ROW_NUMBER() OVER (PARTITION BY CrimeRecords.CaseNum ORDER BY CrimeRecords.CaseNum) As Idx, CrimeRecords.CaseNum, CrimeRecords.Offense, PrimaryCrime.PrimaryCrime 
FROM (SELECT CaseNum ,x.i.value('.','varchar(20)') AS Offense 
      FROM (SELECT CaseNum, CONVERT(XML,'<i>'+REPLACE(CrimeType, '|', '</i><i>') + '</i>') AS d 
         FROM CrimeView.dbo.tblCrimeData)x1 CROSS APPLY d.nodes('i') AS x(i)) AS CrimeRecords 

編輯:包括PARTITION BY重置爲每種情況下的順序。

+0

我只是試驗 - 我唯一擔心的是,我希望SeqNum匹配管道的順序。我想我不相信排序。 – sernst

0

如果你有一個簡單的表CrimeRecords like CaseNum | CrimeType
你必須做這樣的事情

SELECT CaseNum,CrimeType, @row:[email protected]+1 SeqNum 
FROM CrimeRecords a JOIN (SELECT @row := 0) b; 

確定..我不能crearly看到在您的查詢,我不能嘗試在一個分貝,買嘗試使用我的共享查詢。 這只是一個例子,顯示如何在行中的某些元素中按1,2,3 ... x的順序添加數字。所以請嘗試在查詢中混合使用代碼,並在每次組合時重新啓動@row更改.. 所以你會得到它

+0

不幸的是,這並不簡單。它就像CaseNum,CrimeType - 但是CrimeType在該字段中有一個管道。所以它用逗號分隔,用管道分隔的字段。我剛剛編輯了我的原始帖子,以澄清一些事情。 – sernst

+0

好吧..我不能在你的查詢清楚地看到,我不能在數據庫中嘗試它,買儘量使用我共享的查詢。這只是一個例子,可以顯示如何按照行中的某些元素的順序添加數字1,2,3 ... ...因此,請嘗試在查詢中混合使用代碼,並在每次組更改時重新啓動@row (CaseNum)..所以你會得到它 – Pericles

相關問題