ORDER BY, установить конкретный случай для первого индекса? - PullRequest
1 голос
/ 15 июля 2011

Использование SQL Server 2008 ...

У меня проблемы с попыткой упорядочить строки в определенном порядке, по которому я бы хотел, чтобы они были упорядочены. Я нашел несколько примеров, в которых используется предложение ORDER BY CASE, но я не уверен, что использование этого метода даст результат, которого я хочу, поэтому я прихожу в сообщество!

Вот что у меня есть:

Сначала я выбираю, если он существует, отдельный год, который равен текущему году:

IF EXISTS(SELECT DISTINCT [Year]
FROM Assessment WHERE ProjectCode = @ProjectCode AND [Year] = DATENAME(YEAR, GETDATE()))

SELECT DISTINCT [Year]
FROM Assessment WHERE ProjectCode = @ProjectCode

Но, тогда я нахожу некоторую путаницу в упорядочении результатов. Я хотел бы установить текущий год для первой строки, возвращаемой с помощью предложения ORDER BY, а затем упорядочить оставшиеся возвращенные годы в порядке убывания, вот что у меня получилось:

ORDER BY (CASE WHEN [Year] = (DATENAME(YEAR, GETDATE())) THEN 1
          ELSE 100 END) ASC, [Year] desc

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

    ELSE
SELECT DISTINCT [Year]
FROM Assessment WHERE ProjectCode = @ProjectCode
ORDER BY [Year] desc

Спасибо, заранее!

Ответы [ 3 ]

5 голосов
/ 15 июля 2011

Здесь вам вообще не нужны условные операторы:

SELECT  *
FROM    (
        SELECT  DISTINCT [Year]
        FROM    Assessment
        WHERE   projectCode = @projectCode
        ) q
ORDER BY
        CASE [Year] WHEN YEAR(GETDATE()) THEN 1 ELSE 2 END,
        [Year]

сначала выведет текущий год (если существует), а другой позже.

1 голос
/ 15 июля 2011

Ваш вопрос не очень понятен, потому что вы не указываете, что сломано или где у вас проблемы. Однако из того, что я понял, вам не нужен IF / ELSE. Вместо этого вы могли бы сделать что-то вроде ...

SELECT DISTINCT [Year],  
        CASE [Year] 
            WHEN DATENAME(Year, GETDATE()) THEN 9999
            ELSE [Year] END  AS GarbageSoDistinctWorks
FROM Assessment 
WHERE ProjectCode = @ProjectCode
ORDER BY
        CASE [Year] 
            WHEN DATENAME(Year, GETDATE()) THEN 9999
            ELSE [Year] END  DESC 
* 1003.
Msg 145, Level 15, State 1, Line 2
ORDER BY items must appear in the select list if SELECT DISTINCT is specified.

НТН, -eric

0 голосов
/ 15 июля 2011

Ваш пример кода, кажется, делает то, что вы описываете.Какие у вас проблемы?

В качестве примечания: вам не нужно заявление IF.Используя ORDER BY из вашего первого примера (с оператором CASE), вы получите правильные результаты для обоих сценариев.
- Если в ваших данных указан «этот год», он стоит первым.Все остальное идет в следующем порядке: DESC
. Если «этот год» отсутствует в ваших данных, вы просто получаете все остальное в порядке DESC

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...