2009-10-07 6 views
1

может быть, кто-нибудь может помочь мне с моей инструкцией SELECT на MS SQL Server. Я не очень разбираюсь в (T) SQL.Проблема с DISTINCT, SELECT и SORT в TSQL

У меня есть таблица RECORDS и столбец DATETIME с именем [BEGIN]. Теперь я хотел бы получить некоторые nvarchars, которые выглядят так «08 декабря, 09 января, 09 февраля».

Я сам придумал следующее.

SELECT DISTINCT DATENAME(MONTH, [BEGIN]) + ' ' + SUBSTRING(DATENAME(YEAR, [BEGIN]),3,4) 
FROM RECORDS 

Однако это несортировано. Я хотел бы, чтобы набор результатов был заказан от первого до последнего.

February 09 
January 09 
December 08 

Кто-нибудь?

+1

В будущем вы можете захотеть, чтобы избежать использования имен полей, зарезервированные слова, как начать. Если это еще не сделано, я бы изменил его прямо сейчас! – HLGEM

+0

+1 @HLGEM вы абсолютно правы – raupach

ответ

1
SELECT DATENAME(MONTH, DATEADD(month, b_month - 1, 0)) + ' ' + SUBSTRING(CAST(b_year AS VARCHAR), 3, 4) 
FROM (
     SELECT DISTINCT YEAR([BEGIN]) AS b_year, MONTH([BEGIN]) AS b_month 
     FROM RECORDS 
     ) q 
ORDER BY 
     b_year, b_month 
+0

Теперь это не значит, что нужно работать. Результат - это что-то вроде апреля 07, апрель 08, апрель 09 ... – raupach

+0

'@ rantaplan': см. Обновление – Quassnoi

+0

@Quassnoi Спасибо за вашу помощь, но с вашим последним заявлением все, что я получаю, - это январь 05, снова и снова – raupach

1

насчет

with tbldate AS 
(
select distinct DATENAME(MONTH, date) + ' ' + SUBSTRING(DATENAME(YEAR, date),3,4) as date 
from dbo.tbldate 
) 
select * from tbldate 
order by date desc 
+0

Не будет работать, 'column' не находится в разделе' SELECT' – Quassnoi

+0

Не работает с DISTINCT. См. Комментарий, который я оставил на ответ BBlake – raupach

+0

i обновлен. ты это пробовал? ? ? – anishMarokey

0

Добавить ORDER BY [НАЧАТЬ] DESC

+0

Но это не работает с DISTINCT. Перевод сообщения об ошибке - это что-то вроде элементов ORDER BY, которые необходимо выбрать, если используется SELECT DISTINCT. – raupach

0
SELECT DISTINCT DATENAME(MONTH, [BEGIN]) + ' ' + SUBSTRING(DATENAME(YEAR, [BEGIN]),3,4) FROM RECORDS 
ORDER BY 1 DESC 
1
select datename(month, yyyymm) 
    + ' ' 
    + right(convert(varchar(10), yyyymm), 2) 
from 
(
    select dateadd(month, datediff(month, 0, [BEGIN]), 0) as yyyymm 
    from yourtable 
    group by dateadd(month, datediff(month, 0, [BEGIN]), 0) 
) a 
order by yyyymm desc