簡體   English   中英

如何基於日期參數用月列創建臨時表?

[英]How to create Temp Table with month columns based on date parameters?

我有一個接受兩個日期的存儲過程。 在存儲過程中,我需要創建一個臨時表,其中以兩個日期之間的月份為列。

例如,

如果用戶通過

1/1/2016 , 8/1/2016

我需要一個帶有列的臨時表:

January February March April May June July August

如何使用以這種方式創建的列來創建這種類型的臨時表? 列基於傳入的兩個日期?

以下腳本可以幫助您開始(並且幾乎可以開始使用):

declare @start_date DATE = '20160101' 
declare @end_date DATE = '20160801'

;WITH CTE AS
(
    SELECT @start_date AS cte_start_date, DATENAME(month, @start_date) AS Name,
        CAST(' ALTER TABLE #myTemp ADD ' + DATENAME(month, @start_date) + ' INT ' + CHAR(13) + CHAR(10) AS VARCHAR(8000)) AS SqlStr
    UNION ALL
    SELECT DATEADD(MONTH, 1, cte_start_date), DATENAME(month, DATEADD(MONTH, 1, cte_start_date)) AS Name, 
        CAST(SqlStr + ' ALTER TABLE #myTemp ADD ' + DATENAME(month, DATEADD(MONTH, 1, cte_start_date)) + ' INT ' + CHAR(13) + CHAR(10) AS VARCHAR(8000))
    FROM CTE
    WHERE DATEADD(MONTH, 1, cte_start_date) <= @end_date   
)
SELECT cte_start_date, Name, SqlStr 
FROM CTE

使用遞歸CTE,它將在開始日期和結束日期之間生成一個循環,並針對每個月計算其字符串表示形式,並創建一個alter腳本以將列添加到臨時表中。

CTE逐步計算SQL腳本,因此最終腳本位於最后一行。

嘗試這個 ....

declare @start_date DATE = '20160101' 
declare @end_date DATE = '20160801'

;WITH CTE AS
(
    SELECT @start_date AS cte_start_date, DATENAME(month, @start_date) AS NAME , 0 AS Coun
    UNION ALL
    SELECT DATEADD(MONTH, 1, cte_start_date), DATENAME(month, DATEADD(MONTH, 1, cte_start_date)) AS NAME , 0 AS Coun
    FROM CTE
    WHERE DATEADD(MONTH, 1, cte_start_date) <= @end_date   
)

SELECT  Coun,Name
INTO #tmp1
FROM CTE

DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + Name 
                 from #tmp1

        FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'')

set @query = 'SELECT ' + @cols + ' from 
         (
            select Coun,Name
            from #tmp1
        ) x
        pivot 
        (
            MAX(Coun)
            for Name in (' + @cols + ')
        ) p '

execute(@query);
DROP TABLE #tmp1

它將像您的預期輸出一樣返回OutPut。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM