Как сортировать столбец после точки в десятичном числе - Ms access - PullRequest
0 голосов
/ 30 августа 2018

Я хочу отсортировать столбец Нравится ... Пример : 1,1, 1.2, 1,3, , , , , 1,9, 1,10, 1,11, 1,12, , , , 2,1, 2,2, 2,3, , , , 2,9, 2,10, 2,11, , , , 3.1, 3,2, ... так далее ..

Я попробовал это,

    SELECT SectionName.UnderISMDocNumber
    FROM SectionName
    ORDER BY SectionName.UnderISMDocNumber;

Но я получаю такой результат

Кто-нибудь может направить меня? Как я могу отфильтровать этот столбец в Ms Access?

Ответы [ 4 ]

0 голосов
/ 30 августа 2018

Если часть перед числом имеет фиксированную длину (например, одну цифру, как в ваших примерах), то существует простой краткий вызов:

ORDER BY LEN(SectionName.UnderISMDocNumber),
         SectionName.UnderISMDocNumber
0 голосов
/ 30 августа 2018

Хотя решение Марлана в порядке, вы также можете использовать немного более сложное решение SQL для разделения строки. Преимущество этого заключается в возможности вызова вне приложения Access и использовании ADO и DAO.

SELECT SectionName.UnderISMDocNumber
FROM SectionName
ORDER BY 
     IIf(SectionName.UnderISMDocNumber LIKE "*.*", Val(Left(SectionName.UnderISMDocNumber, 
           Val(Left(SectionName.UnderISMDocNumber, InStr(SectionName.UnderISMDocNumber, ".") - 1),
            SectionName.UnderISMDocNumber
     )
     , 
     IIf(SectionName.UnderISMDocNumber LIKE "*.*", Val(Left(SectionName.UnderISMDocNumber, 
           Len(SectionName.UnderISMDocNumber) - InStr(SectionName.UnderISMDocNumber, "."))), 
            0
     )

Пояснение:

Val бросает строки в число InStr находит точку в строке. Left возвращает левую часть строки. Right возвращает часть справа от строки.

Альтернатива, основанная на числовом характере столбца:

SELECT SectionName.UnderISMDocNumber
FROM SectionName
ORDER BY Int(Val(SectionName.UnderISMDocNumber)),
         Val(SectionName.UnderISMDocNumber) -Int(Val(SectionName.UnderISMDocNumber)) * (InStr(StrReverse(SectionName.UnderISMDocNumber), ".") - 1);

Пояснение:

Int(Val(SectionName.UnderISMDocNumber)) - это целая часть числа. Val(SectionName.UnderISMDocNumber) -Int(Val(SectionName.UnderISMDocNumber)) - десятичная часть числа (число - целая часть числа) *(InStr(StrReverse(SectionName.UnderISMDocNumber), ".") - 1) умножает десятичную часть на количество десятичных знаков

0 голосов
/ 30 августа 2018

Вы можете отсортировать по причудливому выражению, преобразовав вторую часть в целое число, затем упорядочив по этому:

SELECT 
    UnderISMDocNumber
FROM 
    SectionName
ORDER BY 
    Int(Val([UnderISMDocNumber])), Val(Mid(Str(CCur(Val([UnderISMDocNumber]))-Int(Val([UnderISMDocNumber]))),3));

Но у вас серьезные проблемы, так как вы смешиваете сортировку строк и числовую сортировку, когда используете записи типа 3.03 с ведущими нулями, как вы можете видеть:

UnderISMDocNumber
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
1.11
1.12
1.13
2
2.1
2.2
3.01
3.10
3.02
3.03
3.04
3.5
3.11
3.12
3.13

Итак, либо используйте нули и обычную числовую сортировку на Val([UnderISMDocNumber]), либо не используйте начальные нули во второй части. Вы не можете иметь оба.

0 голосов
/ 30 августа 2018

Ваш SQL:

SELECT SectionName.UnderISMDocNumber
FROM SectionName
ORDER BY SplitOrderField(SectionName.UnderISMDocNumber, 0), SplitOrderField(SectionName.UnderISMDocNumber, 1);

И в модуле VBA:

Public Function SplitOrderField (str as String, i as Intiger)as Long
    SplitOrderField = CLng(Split (str)(i)) 
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...