我有以下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有所有的答案。
有人能想到解决这个问题的方法比简单地削减我的手腕更快吗?我知道失血造成的死亡可能会令人惊讶地挥之不去,我有最后期限可以满足。
感谢您的帮助。
大卫
答案 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让你在圈子里跑来跑去。
但就目前而言,我的手腕没有标记。