2015-07-22 2 views
3


У меня есть поле varchar CaseNo в таблице, которая содержит данные в этом формате, например.Сортировка в SQL-запросе в порядке возрастания

FA/12/2014, 
FA/11/2015, 
FA/12/2015, 
FA/11/2014, 
CC/12/2015, 
CC/11/2015 

Я хотел, чтобы отсортировать результаты запроса select следующим образом

CC/11/2015 
CC/12/2015 
FA/11/2014 
FA/12/2014 
FA/11/2015 
FA/12/2015 

Во-первых, он должен сортировать первые два символа в алфавитном порядке. И тогда оставшиеся цифры в порядке возрастания и результата должны быть как указано выше.
Примечание: - последняя часть данных - год, но средняя часть - это не месяц, это просто число.
Можно ли это сделать.
Благодаря

+0

Посмотрим относительный вопрос [здесь] [1], Надеюсь, что это поможет! [1]: http://stackoverflow.com/questions/5493510/turning-a-comma-separated-string-into-individual-rows –

+0

спасибо, что раствор, связанные с spliting полевых данных, но я хотел сортировать данные на основе частей данных поля –

ответ

2

Вы должны сделать это:

select * from temp 
    order by 
    left(columnA,2) asc , 
    right(columnA,4) asc,  
    cast(replace(replace(columnA,left(columnA,3),''),right(columnA,5),'') as int) asc 

И DEMO Вот ! Итак, вы отредактировали сообщение, и это должно работать нормально. Это не преобразование в Дату последней части строки

+0

Спасибо за первую часть и последнюю часть сортируют хорошо, но средняя часть по-прежнему создает проблему. Посмотрите
следующий результат
FA/7/2015 FA/8/2015 FA/9/2015 FA/100/2015 FA/600/2015 FA/500/2015 FA/200/2015 FA/700/2015 FA/701/2015 FA/201/2015 FA/501/2015 FA/601/2015 FA/101/2015 FA/102/2015 FA/602/2015 FA/502/2015 FA/702/2015 FA/202/2015 FA/203/2015 FA/703/2015 FA/503/2015 FA/603/2015 FA/103/2015 FA/104/2015 FA/604/2015 Ф.А./504/2015 FA/204/2015 –

+0

Ha sry я не знал, что среднее число может быть больше, чем 99 – danvasiloiu

+0

точно ........ –

3

Вероятно, это то, что вы ищете:

select * from table1 
order by left(col1, 2), convert(date, '01/' + substring(col1, 4, 7), 103) 

Мое предположение было то, что последняя часть месяц + год, но, конечно, это может быть что-то другое тоже.

+0

спасибо, что на самом деле последняя часть - год, но средняя часть - это просто не месяц. –

1

Попробуйте order by. Более общий способ

ORDER BY LEFT ('FA/12/2014', Charindex('/', 'FA/12/2014') - 1), 
      Cast('01'+ Substring('FA/12/2014', Charindex('/', 'FA/12/2014'), 8) AS DATE) 

DEMO

SELECT * 
FROM (VALUES ('CC/11/2015'), 
       ('CC/12/2015'), 
       ('FA/11/2014'), 
       ('FA/12/2014'), 
       ('FA/11/2015'), 
       ('FA/12/2015')) tc (dates) 
ORDER BY LEFT (dates, Charindex('/', dates) - 1), 
      Cast('01' 
       + Substring(dates, Charindex('/', dates), 8) AS DATE) 

Результат:

dates 
---------- 
CC/11/2015 
CC/12/2015 
FA/11/2014 
FA/12/2014 
FA/11/2015 
FA/12/2015 
+0

Почему вы выбрали самый сложный способ сделать это? – danvasiloiu

+0

@dzomba - Нет. Это не о сложном его более общем. Завтра вместо CC, если появится CCC, это будет работать. –

+0

«Примечание: - последняя часть данных - год, но средняя часть - это не месяц, а просто число». так что ваш ответ не очень хорош. – danvasiloiu

0

Я думаю, что вы можете использовать ParseName в этом случае

SELECT * 
FROM #Your_Table 
ORDER BY Parsename(Replace(columnA, '/', '.'), 3), 
      Parsename(Replace(columnA, '/', '.'), 1), 
      Parsename(Replace(columnA, '/', '.'), 2) 
Смежные вопросы