T-SQL - как обойти заказ по ограничению в CTE - PullRequest
2 голосов
/ 14 июня 2010

У меня есть следующий CTE. Его целью является предоставление уникальных пар месяц / год. Более поздний код будет использовать CTE для создания объединенного списка строк пар Месяц / Год.

;WITH tblStoredWillsInPeriod AS
(
    SELECT DISTINCT Kctc.GetMonthAndYearString(DateWillReceived) Month
    FROM Kctc.StoredWills
    WHERE DateWillReceived BETWEEN '2010/01/01' AND '2010/03/31'
    ORDER BY DateWillReceived
)

Я пропустил реализацию функции GetMonthAndYearString, поскольку она тривиальна.

Редактировать: По просьбе Мартина, вот код:

DECLARE @PivotColumnHeaders nvarchar(MAX)
--CTE declaration as above---
SELECT @PivotColumnHeaders =
  COALESCE(
    @PivotColumnHeaders + ',[' + Month + ']',
    '[' + Month + ']'
  )
FROM tblStoredWillsInPeriod
SELECT @PivotColumnHeaders

К сожалению, кажется, что T-SQL всегда на шаг впереди. Когда я запускаю этот код, он говорит мне, что я не могу использовать ORDER BY в CTE, если я также не использую TOP (или FOR XML, что бы это ни было.) Если я использую TOP, он говорит, что я не могу его с отличием. Да, у T-SQL есть все ответы.

Кто-нибудь может придумать решение этой проблемы, которое быстрее, чем просто порезать мои запястья? Я понимаю, что смерть от потери крови может быть удивительно долгой, и у меня есть сроки, которые нужно соблюдать.

Спасибо за вашу помощь.

David

Ответы [ 5 ]

1 голос
/ 14 июня 2010

Будет ли это работать?

DECLARE @PivotColumnHeaders VARCHAR(MAX)

;WITH StoredWills AS
(
SELECT GETDATE() AS DateWillReceived
UNION ALL
SELECT '2010-03-14 11:48:07.580'
UNION ALL
SELECT '2010-03-12 11:48:07.580'
UNION ALL
SELECT '2010-02-12 11:48:07.580'
),
tblStoredWillsInPeriod AS
(
    SELECT DISTINCT STUFF(RIGHT(convert(VARCHAR, DateWillReceived, 106),8), 4, 1, '-') AS  MMMYYYY, 
    DatePart(Year,DateWillReceived) AS  Year,
    DatePart(Month,DateWillReceived) AS  Month
    FROM StoredWills
    WHERE DateWillReceived BETWEEN '2010-01-01' AND '2010-03-31'
)


SELECT @PivotColumnHeaders =
  COALESCE(
    @PivotColumnHeaders + ',[' + MMMYYYY + ']',
    '[' + MMMYYYY + ']'
  )
FROM tblStoredWillsInPeriod
ORDER BY Year, Month
0 голосов
/ 14 июня 2010

И вы думаете, что знаете синтаксис T-SQL!

Оказывается, я ошибся из-за того, что не смог использовать TOP и DISTINCT вместе.

Это приводит к синтаксической ошибке ...

SELECT TOP 100 PERCENT DISTINCT...

тогда как это абсолютно нормально ...

SELECT DISTINCT TOP 100 PERCENT...

Работай над этим.

Один недостаток заключается в том, что вы должны включить поле ORDER BY в список SELECT, что, по всей вероятности, повлияет на ожидаемые результаты DISTINCT. Иногда T-SQL заставляет вас бегать кругами.

Но пока мои запястья не помечены.

0 голосов
/ 14 июня 2010

А как же?

;WITH tblStoredWillsInPeriod AS 
( 
    SELECT DISTINCT Kctc.GetMonthAndYearString(DateWillReceived) Month 
    FROM Kctc.StoredWills 
    WHERE DateWillReceived BETWEEN '2010/01/01' AND '2010/03/31' 
    ORDER BY DateWillReceived 
),
tblStoredWillsInPeriodOrdered AS
(
    SELECT TOP 100 PERCENT Month 
    FROM tblStoredWillsInPeriod 
    ORDER BY Month
)
0 голосов
/ 14 июня 2010
SELECT DISTINCT TOP 100 PERCENT ...
ORDER BY ...
0 голосов
/ 14 июня 2010

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

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