【发布时间】:2012-01-23 07:25:52
【问题描述】:
我很确定我需要一个支点来做到这一点,但我不太清楚。 (sql newb)
我有这样的数据:
ID CompanyID Year Revenue Expenses
1 0003 2011 12000 4000
2 0003 2010 9000 6000
3 0003 2009 7000 9000
4 0010 2011 134300 34000
5 0010 2010 43000 46000
6 0010 2009 73000 39000
我可以像这样使用数据透视表来显示这个表格吗:
CompanyID 2011-Revenue 2010-Revenue 2009-Revenue 2011-Expenses 2010-Expenses 2009-Expenses
0003 12000 9000 7000 4000 6000 9000
0010 134300 43000 73000 34000 46000 39000
这是我目前所拥有的......
SELECT P1.*
FROM (SELECT [CompanyID]
,CASE P.[Year] WHEN 2011 THEN P.[Revenue] ELSE NULL END AS '2011-Revenue'
,CASE P.[Year] WHEN 2010 THEN P.[Revenue] ELSE NULL END AS '2010-Revenue'
FROM tblRecords P WHERE P.[CompanyID] = @companyID GROUP BY CompanyID, [Year], [Revenue]) AS P1
返回:
CompanyID 2011-Revenue 2010-Revenue
0003 12000 NULL
0003 NULL 9000
我的结果几乎没有问题...
CompanyID 0003 有两条记录,我希望将其归为一条记录
-
我一次只能选择1家公司,我需要选择多个。我试过了
FROM tblRecords P WHERE P.[CompanyID] IN (@CompanyIDs) GROUP BY CompanyID, [Year], [Revenue]) AS P1其中
@CompanyIDs是一个类似'0003, 0010'的字符串 - 它没有失败,但结果只是一个带有标题且没有数据的空表。
任何帮助将不胜感激.. 如果我误解了 pivot,请告诉我?
非常感谢!
托马斯
编辑:使用 Microsoft SQL Server Management Studio 2005 Express
更新 2:我已经想出了加入表格以获取更多详细信息,但是我仍然需要能够将 CompanyID 作为逗号分隔的字符串传递.. 对此的任何帮助将不胜感激。
vvvvvvvv 我已经弄清楚了(一旦一切正常就会发布)vvvvvvv
更新:看起来 Ruben 提议的内容会起作用,但是我刚刚确定我需要更多功能...我可以将它与另一个表连接起来以获得标题
CompanyID CompanyName CompanyAddress 2011-Revenue 2010-Revenue
CompanyName 和 CompanyAddress 来自另一个表 (tblCompanyDetails)
我尝试过使用:
SELECT *
FROM
(
SELECT CompanyID, tblCompanyDetails.CompanyName, tblCompanyDetails.CompanyAddress, CAST(YEAR AS varchar) + ' - Revenue' Type,
Revenue Value FROM tblRecords
FROM tblRecords INNER JOIN tblCompanyDetails ON tblRecords.CompanyID = tblCompanyDetails.CompanyID
UNION ALL
SELECT CompanyID, tblCompanyDetails.CompanyName, tblCompanyDetails.CompanyAddress, CAST(YEAR AS varchar) + ' - Expenses' Type,
Expenses Value FROM tblRecords
FROM tblRecords INNER JOIN tblCompanyDetails ON tblRecords.CompanyID = tblCompanyDetails.CompanyID
) src
PIVOT
(
SUM(Value) for [Type] in
([2011 - Revenue], [2010 - Revenue], [2009 - Revenue],
[2011 - Expenses], [2010 - Expenses], [2009 - Expenses]
)
) pvt
WHERE CompanyID = @CompanyID
我得到错误:
Msg 1038, Level 15, State 4, Procedure spCompare, Line 10
An object or column name is missing or empty. For SELECT INTO statements, verify each column has a name. For other statements, look for empty alias names. Aliases defined as "" or [] are not allowed. Add a name or single space as the alias name.
【问题讨论】:
-
是的,抱歉,我包含了 TSQL 标记,但可能更具体。微软 SQL Server 2005
-
我觉得通常只在服务器上执行 GROUP BY,然后在客户端应用程序中对结果进行交叉表比较灵活。
标签: sql-server sql-server-2005 tsql pivot crosstab