2017-06-12 8 views
1

私は、さまざまな月の終わりに今日の日付を加えた日付のリストを持つ単一の列を生成しようとしています。これまでのところ、私は持っています:日付はTransposeでSQLの単一列に格納されますか?

DECLARE @date DATETIME = '7/1/2016'; 
SELECT 
CONVERT(char(10), GetDate(),126) 
,EOMONTH (@date, 1) 
,EOMONTH (@date, 2) 
,EOMONTH (@date, 3) 
,EOMONTH (@date, 4) 
,EOMONTH (@date, 5) 
,EOMONTH (@date, 6) 
,EOMONTH (@date, 7) 
,EOMONTH (@date, 8) 
,EOMONTH (@date, 9) 
,EOMONTH (@date, 10) 
,EOMONTH (@date, 11) 
,EOMONTH (@date, 12) ; 
GO 

しかし、それは私にそれぞれの結果が新しい列である出力を与えます。この出力を転置して1つの列にし、新しい結果が新しい行になるようにする方法はありますか?

答えて

2

私が正しく理解すれば、私はただVALUESを使用します。

DECLARE @date DATETIME = '2016-07-01'; 

SELECT v.* 
FROM (VALUES (@date), 
      (EOMONTH(@date, 1)) , 
      (EOMONTH(@date, 2)), 
      (EOMONTH(@date, 3)), 
      (EOMONTH(@date, 4)), 
      (EOMONTH(@date, 5)), 
      (EOMONTH(@date, 6)), 
      (EOMONTH(@date, 7)), 
      (EOMONTH(@date, 8)), 
      (EOMONTH(@date, 9)), 
      (EOMONTH(@date, 10)), 
      (EOMONTH(@date, 11)), 
      (EOMONTH(@date, 12)) 
      ) v(dte); 
0

それは再帰CTE使用している行う一つの方法:

DECLARE @date DATE = '2016-07-01'; 

;WITH CTE AS 
(
    SELECT 1 As n 
    UNION ALL 
    SELECT n + 1 
    FROM CTE 
    WHERE n < 12 
) 
SELECT n, EOMONTH (@date, n) 
FROM CTE 

See a live demo on rextester

別の、そしておそらくより良い方法は、集計テーブルを使用することです。
集計テーブルが何であるかわからない場合、なぜそれがあなたにとって良いのかわからない場合は、read this article by Jeff Moden

すでに、集計テーブルを持っているものを作成しない場合:

SELECT TOP 10000 IDENTITY(int,1,1) AS Number 
    INTO Tally 
    FROM sys.objects s1  
    CROSS JOIN sys.objects s2 
ALTER TABLE Tally ADD CONSTRAINT PK_NumbersTest PRIMARY KEY CLUSTERED (Number) 

次に、あなたのコードがそれと同じくらい簡単です:

DECLARE @date DATE = '2016-07-01'; 

SELECT Number, EOMONTH (@date, Number) 
FROM Tally 
WHERE Number < 13 

Live demo for a tally table

0

Declare @Date date = '7/1/2016'; 
Declare @Mnth int = 12  -- << Optional allows you to define the # of months 

Select D = @Date 
Union All 
Select Top (@Mnth) EOMonth(@Date,Row_Number() Over (Order By (Select NULL))) 
From master..spt_values -- << Virtually any Table Will Do 

戻り

D 
2016-07-01 
2016-08-31 
2016-09-30 
2016-10-31 
2016-11-30 
2016-12-31 
2017-01-31 
2017-02-28 
2017-03-31 
2017-04-30 
2017-05-31 
2017-06-30 
2017-07-31 
関連する問題