Sql server 如何编写数据透视表以列形式显示每年的记录?
我很确定我需要一个支点来做这件事,但我不太明白。(sql newb) 我有这样的数据:Sql server 如何编写数据透视表以列形式显示每年的记录?,sql-server,sql-server-2005,tsql,pivot,crosstab,Sql Server,Sql Server 2005,Tsql,Pivot,Crosstab,我很确定我需要一个支点来做这件事,但我不太明白。(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 134
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
我是否可以使用透视来显示此表,如下所示:
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
我的结果有一些问题
FROM tblRecords P
WHERE P.[CompanyID] IN (@CompanyIDs)
GROUP BY CompanyID, [Year], [Revenue]) AS P1
其中,@CompanyIDs
是一个类似于'00030010'
的字符串-它没有失败,但结果只是一个带有标题且没有数据的空表 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.
试试这个:
DECLARE @CompanyIDs XML
DECLARE @Records TABLE
(
ID int,
CompanyID char(4),
Year int,
Revenue decimal,
Expenses decimal
)
DECLARE @CompanyDetails TABLE
(
CompanyID char(4),
Name varchar(50),
Address varchar(50)
)
SET @CompanyIDs = '
<filter>
<CompanyID>0003</CompanyID>
<CompanyID>0010</CompanyID>
</filter>'
INSERT INTO @Records
(ID, CompanyID, Year, Revenue, Expenses)VALUES
(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)
INSERT INTO @CompanyDetails
(CompanyID, Name, Address) VALUES
('0003', 'Company A', 'A Street'),
('0010', 'Company B', 'B Street')
SELECT *
FROM
(
SELECT CompanyID, CAST(YEAR AS varchar) + ' - Revenue' Type,
Revenue Value FROM @Records
UNION ALL
SELECT CompanyID, CAST(YEAR AS varchar) + ' - Expenses' Type,
Expenses Value FROM @Records
) src
PIVOT
(
SUM(Value) for [Type] in
([2011 - Revenue], [2010 - Revenue], [2009 - Revenue],
[2011 - Expenses], [2010 - Expenses], [2009 - Expenses]
)
) pvt
JOIN @CompanyDetails Details
ON Details.CompanyId = pvt.CompanyID
WHERE pvt.CompanyID IN
(
SELECT T.C.value('.', 'char(4)')
FROM @CompanyIDs.nodes('/filter/CompanyID') T(C)
)
DECLARE@CompanyIDs XML
声明@Records表
(
ID int,
公司ID字符(4),
整年,
收入小数,
费用小数
)
声明@CompanyDetails表
(
公司ID字符(4),
名称varchar(50),
地址:varchar(50)
)
SET@CompanyIDs='1〕
0003
0010
'
插入@Records
(ID、公司ID、年份、收入、费用)值
(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)
插入到@CompanyDetails中
(公司ID、名称、地址)值
(‘0003’、‘A公司’、‘A街’),
(‘0010’、‘B公司’、‘B街’)
挑选*
从…起
(
选择CompanyID,CAST(年份为varchar)+“-Revenue”类型,
来自@Records的收入价值
联合所有
选择CompanyID,CAST(年份为varchar)+“-Expenses”类型,
来自@Records的费用价值
)src
支点
(
中[Type]的总和(值)
([2011-收入]、[2010-收入]、[2009-收入],
[2011-费用],[2010-费用],[2009-费用]
)
)pvt
加入@CompanyDetails详细信息
关于Details.CompanyId=pvt.CompanyId
私人公司在哪里
(
选择T.C.值(‘.’,‘字符(4)’)
来自@CompanyID.nodes('/filter/CompanyID')T(C)
)
您需要将公司筛选器作为XML发送,并根据透视操作的需要使用该子选择来断开数据。对于连接操作,只需使用
pvt
output是的,对不起,我包括了TSQL标记,但可以更具体一些。Micorsoft SQL Server 2005我觉得在服务器上只进行分组,然后在客户端应用程序中对结果进行交叉制表,通常更为灵活。看起来这会起作用。但是,我在最后添加了CompanyID=@CompanyID,这样就可以将所有年度数据放在一行,然而,当我在(@CompanyIDs)中添加WHERE CompanyID时,它并没有出错,只是返回了一个空表,您知道如何使WHERE子句工作吗?非常感谢您让我走到这一步。感谢您的更新,我将尝试使用xml-我非常感谢您的帮助。。请参阅更新,了解我在初始问题中遗漏的一点。。。非常感谢你。