【发布时间】:2013-12-30 09:18:42
【问题描述】:
这里是示例数据:
CalculationDatePLResult
2014-01-02 100
2014- 01-03 200
2014-02-03 300
2014-02-04 400
2014-02-27 500
这是预期的结果(逻辑格式):
一月 二月
计算日期PLResultD>PLResultD
2014-01-02 100 2014-02-03 300
2014-01-03 200 2014-02-04 400
2014-02-27 500
这是预期的结果(使用 T-SQL 查询):
Jan-CalculationDateJan-PLResultFeb-CalculationDateFeb-PLResult
2014 -01-02 KBD> 100 KBD> 2014-02-03 KBD> 300 KBD>
2014-01-03 KBD > 200 kBd> 2014-02-04 KBD> 400 KBD>
KBD> KBD> 2014 -02-27 500
目标:
- 按月份对结果进行分类。在上面的示例中,一月份的结果放在一月份的细分中。
- 月数可以是动态的。在上面的例子中,它只显示了 1 月和 2 月,因为只有 2 个月的结果
- 结果将通过 Excel 显示。其实我可以查询多个查询表来汇总不同月份的结果,但是如果可以通过一个查询返回所有结果,那么维护和调试会更容易。
以下是填充示例数据的脚本:
CREATE TABLE #PLResultPerDay ( CalculationDate DATETIME, PLResult DECIMAL(18,8) )
INSERT INTO #PLResultPerDay ( CalculationDate, PLResult ) VALUES ('2014-01-02' , 100 )
INSERT INTO #PLResultPerDay ( CalculationDate, PLResult ) VALUES ('2014-01-03' , 200 )
INSERT INTO #PLResultPerDay ( CalculationDate, PLResult ) VALUES ('2014-02-03' , 300 )
INSERT INTO #PLResultPerDay ( CalculationDate, PLResult ) VALUES ('2014-02-04' , 400 )
到目前为止,这是我构建查询的尝试:
SELECT
CalculationDate, [January], CalculationDate, [February]
FROM
(
SELECT CalculationDate, PLResult, DATENAME(MONTH, CalculationDate) AS [MTH]
FROM #PLResultPerDay
) x
PIVOT
(
MIN(PLResult)
FOR [MTH] IN ([January], [February])
) p
【问题讨论】:
-
您的预期结果实际上是不可能的。您不能有列的层次结构。如果您希望它以这种方式呈现,请在表示层中进行。 SQL 将返回 4 列。例如
JanCalc, JanPL, FebCalc, FebPL -
@MartinSmith:谢谢,我对预期结果做了一些更正。
-
编辑的结果还是不行,PIVOT不能这样工作。这种类型的操作不应该在 SQL 中进行,而是在使用 SQL 结果的代码中进行。
-
关于“结果将显示在Excel中”。您可能会很快使用 Matrix 控件在 Reporting Services 中敲出某些内容以获得所需的格式。
标签: sql-server sql-server-2008 tsql sql-server-2012 pivot