2

我有以下 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 总是领先一步。当我运行此代码时,它告诉我不允许在 CTE 中使用 ORDER BY,除非我也使用 TOP(或 FOR XML,不管是什么)。如果我使用 TOP,它会告诉我不能使用它与不同。是的,T-SQL 有所有的答案。

谁能想到比简单地割腕更快的解决这个问题的方法?我知道失血导致的死亡可能会令人惊讶地挥之不去,而且我有最后期限要赶上。

谢谢你的帮助。

大卫

4

5 回答 5

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
于 2010-06-14T14:17:47.580 回答
0

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

于 2010-06-14T10:35:16.993 回答
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
)
于 2010-06-14T10:42:16.857 回答
0
SELECT DISTINCT TOP 100 PERCENT ...
ORDER BY ...
于 2010-06-14T11:19:17.243 回答
0

而且您认为您知道 T-SQL 语法!

事实证明,我不能同时使用 TOP 和 DISTINCT 是错误的。

这会产生语法错误...

SELECT TOP 100 PERCENT DISTINCT...

而这绝对没问题...

SELECT DISTINCT TOP 100 PERCENT...

解决那个问题。

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

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

于 2010-06-14T13:08:44.510 回答