创建具有月份范围的SQL表作为列并使用表数据填充字段

时间:2014-02-27 16:26:34

标签: sql sql-server sql-server-2008-r2

我需要创建一个SQL表或视图,它会在两个日期之间的每个月生成列。因此2014年1月1日至2014年4月1日的范围将生成四个标题为2014年1月,2014年2月,2014年3月,2014年4月的标题。我还需要它来填充与这些月份相关的数据字段。在下表中,任何没有适当数据的字段都将使用空值填充:

------------------------------------------------------
|     Project#    |    Months    |    MonthValues    |
------------------------------------------------------
|       001       |   Jan 2014   |        1          |
------------------------------------------------------
|       002       |   Feb 2014   |        2          |
------------------------------------------------------

这应创建表格:

---------------------------------------------------------------------------------------
|     Project#    |    Jan 2014    |    Feb 2014    |   March 2014   |   April 2014   |
---------------------------------------------------------------------------------------
|       001       |       1        |      null      |      null      |      null      |
---------------------------------------------------------------------------------------
|       001       |      null      |       2        |      null      |      null      |
---------------------------------------------------------------------------------------

使用SQL Server 2008。

在没有任何运气的情况下试图了解这个问题,任何帮助都会非常感激!

2 个答案:

答案 0 :(得分:2)

您可以使用PIVOT功能:

SELECT  Project, [Jan 2014], [Feb 2014], [Mar 2014], [April 2014]
FROM    T
        PIVOT
        (   SUM(MonthValues)
            FOR Months IN ([Jan 2014], [Feb 2014], [Mar 2014], [April 2014])
        ) pvt;

<强> Example on SQL Fiddle

如果您需要能够根据日期更改列数,则需要使用Dynamic SQL生成上述查询。关于此,有数百个问题。 I think this one会有所帮助(或者可能是BlueFeet的任何一个答案!)

答案 1 :(得分:1)

CREATE  TABLE #temp(Project# varchar(25), Months varchar(25),MonthValues int)
INSERT INTO #temp VALUES
('001','Jan 2014', 1),('002','Feb 2014',2)


Select Project#, [Jan 2014], [Feb 2014]  FROM #temp
Pivot(
Max(MonthValues) 
For Months In ([Jan 2014],[Feb 2014])
) As myPTable

DROP TABLE #temp