我正在構建一個Common Table Expression (CTE)
SQL Server 2008
用於PIVOT
查詢。如何正確使用兩端的數值對varchar字符串進行排序?
我很難正確排序輸出,因爲有數字值將字符串數據夾在中間。是否有可能做到這一點?
這是一個快速和骯髒的例子,真正的查詢將跨越幾年值的價值。
實施例:
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]
EDIT
當然在我發佈問題後,我的大腦開始工作。我改變了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
看起來像一個壞方法。您從字符串開始,將它們投射到日期時間,運行查詢,然後轉換回字符串。爲什麼不從datedate開始,運行查詢並輸出格式化的日期,但是按實際日期排序? –
由於數據透視表Im使用實際存儲日期,但是以修改後的Julian格式存儲。我需要按周來創建數據透視圖,這些數據將跨越多年。這只是整體解決方案的第一個季度,但這正是我需要的。我並不過分關注表現,因爲這將每月運行一次,並在合理的時間內完成。可能有更好的方法來做到這一點,但這是我現在的解決方案。 – ProfessionalAmateur