2017-09-12 101 views
1

我一直在爲此工作數月。我無法得到natural(真正的字母數字)結果。我很震驚,我無法得到他們,因爲我自1992年以來一直能夠在RPGEBCDIC自然或人類排序順序

我正在尋找SQL,VBS或簡單的Excel或訪問的任何解決方案。下面是數據我有:

299-8, 
3410L-87, 
3410L-88, 
420-A20, 
420-A21, 
420A-40, 
4357-3, 
AN3H10A, 
K117GM-8, 
K129-1, 
K129-15, 
K271B-200L, 
K271B-38L, 
K271D-200EL, 
KD1051, 
KD1062, 
KD1092, 
KD1108, 
KD1108, 
M8000-3, 
MS24665-1, 
SK271B-200L, 
SAYA4008 

我要找的排序爲真正的字母數字順序:

AN3H10A, 
KD1051, 
KD1062, 
KD1092, 
KD1108, 
KD1108, 
K117GM-8, 
K129-1, 
K129-15, 
MS24665-1, 
M8000-3, 
SAYA4008, 
SK271B-200L 

的庫存是7800條記錄,所以我有一些問題的處理權力也是如此。

任何幫助,將不勝感激。

傑夫

+3

數字後的字母比其他方式更自然嗎? – Andre

+0

在字母數字字符串的每一列中,首字母爲真的字母數字權重字母。它來自垃圾卡,然後是平面文件。固定字段寬度導致排序問題,因爲它們沒有按每個字符的位置排序。 – Jeff

回答

1

在本機Excel中,可以添加多個排序列來爲每個字符返回ASCII碼,但是如果字符是數字,則添加一個大數字代碼(例如1000)。

然後在每個輔助列上排序,包括表中的第一列,但不排序。

的公式:

=IFERROR(CODE(MID($A1,COLUMNS($A:A),1))+AND(CODE(MID($A1,COLUMNS($A:A),1))>=48,CODE(MID($A1,COLUMNS($A:A),1))<=57)*1000,"") 

排序對話框:

enter image description here

結果:

enter image description here

可以使用VBA實現類似的算法,而且可能SQL也。我不知道VBS或Access。

+0

我喜歡這種方法的結果。我只是缺少一些關於如何創建ASCII排序的基礎知識。任何一步一步創造你的結果的機會? – Jeff

+0

@Jeff你不明白什麼?你是如何試圖實現這個的?你有沒有在任何地方輸入配方?結果是什麼? –

+0

我在B1中實現了公式。我明白你的思維過程是列出每個角色給它一個ASCii命令(我認爲)。 – Jeff

0

你可以嘗試使用格式爲左填充,以字符串由

select column 
from my_table 
order by Format(column, "0000000000") 
0

添加排序列:

, iif (left(fieldname, 1) between '0' and '9', 1, 0) sortField 
etc 
order by sortField, FieldName 
0

比方說你在列數據「一個」。如果將此公式放在列「B」=IFERROR(IF(LEFT(A1,1)+1>0,"ZZZZZZZ "&A1,A1),A1)中,它會自動將Z添加到所有數值前面,以便在對A-Z進行分類時它們自然會出現在所有字母值之後。後來你可以找到&替換那個有趣的ZZZZZZ字符串...

0

在這種情況下,有很多方法,但最少的工作量是構建兩個分隔分隔符( - )的列。

然後,您可以「填充」右對齊的結果(空格或0),然後對兩列進行排序。

所以在查詢生成器,我們有這樣的:那麼現在

enter image description here

查詢生成器,簡單的排序上:

SELECT Field1, 
Format(
Mid(field1,1,IIf(InStr(field1,"-")=0,50,InStr(field1,"-")-1)), 
">@@@@@@@@@@") AS Expr1, 
Format(
Mid(field1,IIf(InStr(field1,"-")=0,99,InStr(field1,"-")+1)), 
">@@@@@@@@@@") AS Expr2 
FROM Data 

當我們運行上面的原始查詢,我們得到這個第一個派生列,然後在第二個派生列上排序。

如這樣的:

enter image description here

運行查詢,我們得到這樣的結果:

enter image description here

編輯:

看着你想要的結果,它看起來像以上種類是錯誤的。我們必須正確填寫0。

所以這第二次嘗試:

SELECT Field1, 
Left(Mid(field1,1,IIf(InStr(field1,"-")=0,30,InStr(field1,"-")-1)) 
& String(30,"0"),30) AS Expr1, 
Left(Mid(field1,IIf(InStr(field1,"-")=0,99,InStr(field1,"-")+1)) 
& String(30,"0"),30) AS Expr2 
FROM Data 

的結果是這樣的:

enter image description here

鑑於你的小桌子大小,那麼上面的查詢應執行得非常好。