2014-09-11 4 views
0

У меня есть таблица с колонкой «ActionDate», который имеет 2 типа даты:Как отсортировать часть таблицы?

  • некоторые различные реальные даты и
  • постоянные значения «1980-01-01»

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

Образец данных:

1) Текущее состояние:

ActionDate 

2014-01-03 
2014-01-01 
2014-01-02 
1980-01-01 
2014-01-04 
2014-01-05 
1980-01-01 

2) Требуемое состояние:

ActionDate 

2014-01-01 
2014-01-02 
2014-01-03 
2014-01-04 
2014-01-05 
1980-01-01 
1980-01-01 
+0

возможно дубликат [TSQL - можно ли определить порядок сортировки?] (HTTP: // StackOverflow. com/questions/4789241/tsql-is-it-possible-to-define-the-sort-order) – LittleBobbyTables

ответ

6

Используйте CASE заявление, чтобы создать заказ

SELECT ActionDate 
FROM [Your_Table] 
ORDER BY CASE WHEN ActionDate = '01-01-1980' THEN 1 ELSE 0 END, ActionDate 

CASE оператор проверяет дату, когда ваша дата ссылки присваивает значение 1. При использовании в OREDER BY это означает, что строки отмеченные 0 будут представлены отмеченные 1.

Вторая часть ORDER BY использует естественный чтобы отсортировать их от самых старых до новейших.

SQL Fiddle который включает в себя поле сортировки, чтобы помочь вам увидеть, что происходит.

+0

Неверный синтаксис рядом с '='. – tesicg

+0

Что означает 1 и 0? – tesicg

+0

@tesicg - Ответ обновлен, я пропустил ключевое слово 'WHEN', и я добавил дополнительную информацию, чтобы ответить на ваш комментарий. – Tony

-1

Нечто подобное, вероятно, сделать это:

SELECT ActionDate 
FROM dbo.MyTable 
WHERE ActionDate <> '01/01/1980' 
ORDER BY ActionDate 

UNION ALL 

SELECT ActionDate 
FROM dbo.MyTable 
WHERE ActionDate = '01/01/1980' 
+0

У вас не может быть 'ORDER BY', предшествующего оператору UNION, и, кроме того, зачем использовать' UNION', когда вы можете делать все в одном select с 'CASE'? – LittleBobbyTables

0
SELECT * , 'OrderDate' = CASE ActionDate 
WHEN '01-01-1980' THEN 2 
ELSE 1 
END 
FROM YourTable 
ORDER BY OrderDate, data 

В моем решении, я создал столбец OrderDate, который имеет значение 1 или 2, 1 для все реальной DATAS и 2 для '01 - 01-1980 ', то вы можете отсортировать их после этого столбца и после столбца данных.

-1

Начиная с 1980-01-01 это значение начала отметки времени, я полагаю, что ваша дата генерируется автоматически для хранения «сегодняшней даты», когда действие происходит, другими словами, нет даты ниже, чем 1980-01- 01 и в этом случае простой заказ на может сделать задачу (и это гораздо быстрее)

SELECT ActionDate 
FROM [Your_Table] 
ORDER BY ActionDate DESC 
+0

Неверно - посмотрите на их желаемый результат. Они хотят, чтобы все даты, не относящиеся к 1980 году, были в порядке возрастания, а затем даты 1908 года. Кроме того, это уже было принято и принято. – LittleBobbyTables

+0

Да, вы правы, извините, я не заметил «восходящего» порядка –

Смежные вопросы