T-SQL - 如何通过限制CTE绕过订单

时间:2010-06-14 10:20:52

标签: tsql sql-order-by common-table-expression

我有以下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函数的实现,因为它很简单。

编辑:根据Martin的要求,这是周围的代码:

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

可悲的是,似乎T-SQL始终领先一步。当我运行这段代码时,它告诉我我不允许在CTE中使用ORDER BY,除非我也使用TOP(或FOR XML,无论是什么。)如果我使用TOP,它告诉我我不能使用它与DISTINCT。是的,T-SQL有所有的答案。

有人能想到解决这个问题的方法比简单地削减我的手腕更快吗?我知道失血造成的死亡可能会令人惊讶地挥之不去,我有最后期限可以满足。

感谢您的帮助。

大卫

5 个答案:

答案 0 :(得分:1)

这会有用吗?

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

答案 1 :(得分:0)

您是否可以澄清为什么需要订购CTE中的数据?以及为什么您无法使用CTE在查询中订购数据。记住普通子查询中的数据也不能订购。

答案 2 :(得分:0)

怎么样?

;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
)

答案 3 :(得分:0)

SELECT DISTINCT TOP 100 PERCENT ...
ORDER BY ...

答案 4 :(得分:0)

你认为你了解T-SQL语法!

原来我错误的是无法一起使用TOP和DISTINCT。

这会产生语法错误......

SELECT TOP 100 PERCENT DISTINCT...

虽然这绝对没问题......

SELECT DISTINCT TOP 100 PERCENT...

解决这个问题。

一个缺点是您必须在SELECT列表中包含ORDER BY字段,这很可能会干扰您预期的DISTINCT结果。有时T-SQL让你在圈子里跑来跑去。

但就目前而言,我的手腕没有标记。