【发布时间】:2013-05-29 21:39:51
【问题描述】:
我正在SQL Server 2008 中构建一个Common Table Expression (CTE) 以在PIVOT 查询中使用。
我很难对输出进行正确排序,因为中间存在将字符串数据夹在中间的数值。可以这样做吗?
这是一个快速而肮脏的例子,真正的查询将跨越数年的价值。
例子:
Declare @startdate as varchar(max);
Declare @enddate as varchar(max);
Set @startdate = cast((DATEPART(yyyy, GetDate())-1) as varchar(4))+'-12-01';
Set @enddate = cast((DATEPART(yyyy, GetDate())) as varchar(4))+'-03-15';
WITH DateRange(dt) AS
(
SELECT CONVERT(datetime, @startdate) dt
UNION ALL
SELECT DATEADD(dd,1,dt) dt FROM DateRange WHERE dt < CONVERT(datetime, @enddate)
)
SELECT DISTINCT ',' + QUOTENAME((cast(DATEPART(yyyy, dt) as varchar(4)))+'-Week'+(cast(DATEPART(ww, dt) as varchar(2)))) FROM DateRange
电流输出:
,[2012-Week48]
,[2012-Week49]
,[2012-Week50]
,[2012-Week51]
,[2012-Week52]
,[2012-Week53]
,[2013-Week1]
,[2013-Week10]
,[2013-Week11]
,[2013-Week2]
,[2013-Week3]
,[2013-Week4]
,[2013-Week5]
,[2013-Week6]
,[2013-Week7]
,[2013-Week8]
,[2013-Week9]
期望的输出:
,[2012-Week48]
,[2012-Week49]
,[2012-Week50]
,[2012-Week51]
,[2012-Week52]
,[2012-Week53]
,[2013-Week1]
,[2013-Week2]
,[2013-Week3]
,[2013-Week4]
,[2013-Week5]
,[2013-Week6]
,[2013-Week7]
,[2013-Week8]
,[2013-Week9]
,[2013-Week10]
,[2013-Week11]
编辑
当然,在我发布问题后,我的大脑开始工作。我将 DATEADD 更改为添加 1 周而不是 1 天,然后在选择中取出 DISTINCT 并且它起作用了。
DECLARE @startdate AS VARCHAR(MAX);
DECLARE @enddate AS VARCHAR(MAX);
SET @startdate = CAST((DATEPART(yyyy, GetDate())-1) AS VARCHAR(4))+'-12-01';
SET @enddate = CAST((DATEPART(yyyy, GetDate())) AS VARCHAR(4))+'-03-15';
WITH DateRange(dt) AS
(
SELECT CONVERT(datetime, @startdate) dt
UNION ALL
SELECT DATEADD(ww,1,dt) dt FROM DateRange WHERE dt < CONVERT(datetime, @enddate)
)
SELECT ',' + QUOTENAME((CAST(DATEPART(yyyy, dt) AS VARCHAR(4)))+'-Week'+(CAST(DATEPART(ww, dt) AS VARCHAR(2)))) FROM DateRange
【问题讨论】:
-
看起来是个糟糕的方法。您从字符串开始,将它们转换为日期时间,运行查询,然后转换回字符串。为什么不从日期时间开始,运行查询并输出格式化的日期,而是按实际日期排序?
-
因为我使用的数据透视表存储实际日期,但采用修改后的朱利安格式。我需要创建一个跨越数年的按周总计的枢轴。这只是整体解决方案的第一季度,但这正是我所需要的。我不太关心性能,因为这将每月运行一次并在合理的时间内完成。可能有更好的方法来做到这一点,但这就是我现在的解决方案。
标签: sql sql-server-2008 sql-order-by common-table-expression dynamic-pivot