基于下表
id Title Date Metadata
------------------------------------
1 A 08/01/2010 M1
1 A 10/05/2010 M2
1 A 03/15/2011 M3
2 B 09/20/2010 M1
2 B 01/15/2011 M2
3 C 12/15/2010 M1输入变量将是开始日期和结束日期。举个例子,
@startDate = '07/01/2010'
@endDate = '06/30/2011'如何生成以下输出?
Title Jul-10 Aug-10 Sep-10 Oct-10 Nov-10 Dec-10 Jan-11 Feb-11 Mar-11 Apr-11 May-11 Jun-11
-------------------------------------------------------------------------------------------
A Null M1 Null M2 Null Null Null Null M3 Null Null Null
B Null M1 Null Null Null Null M2 Null Null Null Null Null
C Null Null Null Null Null M1 Null Null Null Null Null Null发布于 2010-06-19 01:43:22
您要查找的内容通常称为交叉表查询。如果您要问的是如何在给定静态列列表的情况下构建交叉表查询,您可以这样做:
Select Title
, Min( Case When DatePart(mm, [Date]) = 7 And DatePart(yy, [Date]) = 2010 Then MetaData End ) As [Jul-10]
, Min( Case When DatePart(mm, [Date]) = 8 And DatePart(yy, [Date]) = 2010 Then MetaData End ) As [Aug-10]
, Min( Case When DatePart(mm, [Date]) = 9 And DatePart(yy, [Date]) = 2010 Then MetaData End ) As [Sep-10]
...
From Table
Where [Date] Between @StartDate And @EndDate
Group By Title类似地,您可以按照断开的链接所建议的那样使用透视功能。但是,上面的解决方案和PIVOT功能都依赖于静态列声明。如果您想要的是列的动态列表(也称为动态交叉表),那么您就超出了T-SQL的设计初衷。对于一些笨拙的动态SQL来说,这是可能的,但它很脆弱和笨重。相反,您应该在中间层组件中构建结果集,或者使用将构建交叉表结果的报告工具。
发布于 2010-06-19 01:27:33
使用Pivot表..
一个简单的例子..
USE AdventureWorks;
GO
SELECT DaysToManufacture, AVG(StandardCost) AS AverageCost
FROM Production.Product
GROUP BY DaysToManufacture;
DaysToManufacture AverageCost
0 5.0885
1 223.88
2 359.1082
4 949.4105 查询
SELECT 'AverageCost' AS Cost_Sorted_By_Production_Days,
[0], [1], [2], [3], [4]
FROM
(SELECT DaysToManufacture, StandardCost
FROM Production.Product) AS SourceTable
PIVOT
(
AVG(StandardCost)
FOR DaysToManufacture IN ([0], [1], [2], [3], [4])
) AS PivotTable; 结果
Cost_Sorted_By_Production_Days 0 1 2 3 4
AverageCost 5.0885 223.88 359.1082 NULL 949.4105https://stackoverflow.com/questions/3071799
复制相似问题