交叉数据报表
有时候需要旋转结果以便在水平方向显示列,而在垂直方向显示行。这就是所谓的创建 PivotTable®、创建交叉数据报表或旋转数据。假定有一个表 Pivot,其中每季度占一行。对 Pivot 的 SELECT 操作在垂直方向上列出这些季度:Year Quarter Amount
---- ------- ------
1990 1 1.1
1990 2 1.2
1990 3 1.3
1990 4 1.4
1991 1 2.1
1991 2 2.2
1991 3 2.3
1991 4 2.4生成报表的表必须是这样的,其中每年占一行,每个季度的数值显示在一个单独的列中,如:Year
Q1
Q2
Q3
Q4
1990
1.1
1.2
1.3
1.4
1991
2.1
2.2
2.3
2.4
下面的语句用于创建 Pivot 表并在其中填入第一个表中的数据:USE Northwind
GOCREATE TABLE Pivot
( Year SMALLINT,
Quarter TINYINT,
Amount DECIMAL(2,1) )
GO
INSERT INTO Pivot VALUES (1990, 1, 1.1)
INSERT INTO Pivot VALUES (1990, 2, 1.2)
INSERT INTO Pivot VALUES (1990, 3, 1.3)
INSERT INTO Pivot VALUES (1990, 4, 1.4)
INSERT INTO Pivot VALUES (1991, 1, 2.1)
INSERT INTO Pivot VALUES (1991, 2, 2.2)
INSERT INTO Pivot VALUES (1991, 3, 2.3)
INSERT INTO Pivot VALUES (1991, 4, 2.4)
GO下面是用于创建旋转结果的 SELECT 语句:SELECT Year,
SUM(CASE Quarter WHEN 1 THEN Amount ELSE 0 END) AS Q1,
SUM(CASE Quarter WHEN 2 THEN Amount ELSE 0 END) AS Q2,
SUM(CASE Quarter WHEN 3 THEN Amount ELSE 0 END) AS Q3,
SUM(CASE Quarter WHEN 4 THEN Amount ELSE 0 END) AS Q4
FROM Northwind.dbo.Pivot
GROUP BY Year
GO该 SELECT 语句还处理其中每个季度占多行的表。GROUP BY 语句将 Pivot 中一年的所有行合并成一行输出。当执行分组操作时,SUM 聚合中的 CASE 函数的应用方式是这样的:将每季度的 Amount 值添加到结果集的适当列中,在其它季度的结果集列中添加 0。如果该 SELECT 语句的结果用作电子表格的输入,那么电子表格将很容易计算每年的合计。当从应用程序使用 SELECT 时,可能更易于增强 SELECT 语句来计算每年的合计。例如:SELECT P1.*, (P1.Q1 + P1.Q2 + P1.Q3 + P1.Q4) AS YearTotal
FROM (SELECT Year,
SUM(CASE P.Quarter WHEN 1 THEN P.Amount ELSE 0 END) AS Q1,
SUM(CASE P.Quarter WHEN 2 THEN P.Amount ELSE 0 END) AS Q2,
SUM(CASE P.Quarter WHEN 3 THEN P.Amount ELSE 0 END) AS Q3,
SUM(CASE P.Quarter WHEN 4 THEN P.Amount ELSE 0 END) AS Q4
FROM Pivot AS P
GROUP BY P.Year) AS P1
GO
有时候需要旋转结果以便在水平方向显示列,而在垂直方向显示行。这就是所谓的创建 PivotTable®、创建交叉数据报表或旋转数据。假定有一个表 Pivot,其中每季度占一行。对 Pivot 的 SELECT 操作在垂直方向上列出这些季度:Year Quarter Amount
---- ------- ------
1990 1 1.1
1990 2 1.2
1990 3 1.3
1990 4 1.4
1991 1 2.1
1991 2 2.2
1991 3 2.3
1991 4 2.4生成报表的表必须是这样的,其中每年占一行,每个季度的数值显示在一个单独的列中,如:Year
Q1
Q2
Q3
Q4
1990
1.1
1.2
1.3
1.4
1991
2.1
2.2
2.3
2.4
下面的语句用于创建 Pivot 表并在其中填入第一个表中的数据:USE Northwind
GOCREATE TABLE Pivot
( Year SMALLINT,
Quarter TINYINT,
Amount DECIMAL(2,1) )
GO
INSERT INTO Pivot VALUES (1990, 1, 1.1)
INSERT INTO Pivot VALUES (1990, 2, 1.2)
INSERT INTO Pivot VALUES (1990, 3, 1.3)
INSERT INTO Pivot VALUES (1990, 4, 1.4)
INSERT INTO Pivot VALUES (1991, 1, 2.1)
INSERT INTO Pivot VALUES (1991, 2, 2.2)
INSERT INTO Pivot VALUES (1991, 3, 2.3)
INSERT INTO Pivot VALUES (1991, 4, 2.4)
GO下面是用于创建旋转结果的 SELECT 语句:SELECT Year,
SUM(CASE Quarter WHEN 1 THEN Amount ELSE 0 END) AS Q1,
SUM(CASE Quarter WHEN 2 THEN Amount ELSE 0 END) AS Q2,
SUM(CASE Quarter WHEN 3 THEN Amount ELSE 0 END) AS Q3,
SUM(CASE Quarter WHEN 4 THEN Amount ELSE 0 END) AS Q4
FROM Northwind.dbo.Pivot
GROUP BY Year
GO该 SELECT 语句还处理其中每个季度占多行的表。GROUP BY 语句将 Pivot 中一年的所有行合并成一行输出。当执行分组操作时,SUM 聚合中的 CASE 函数的应用方式是这样的:将每季度的 Amount 值添加到结果集的适当列中,在其它季度的结果集列中添加 0。如果该 SELECT 语句的结果用作电子表格的输入,那么电子表格将很容易计算每年的合计。当从应用程序使用 SELECT 时,可能更易于增强 SELECT 语句来计算每年的合计。例如:SELECT P1.*, (P1.Q1 + P1.Q2 + P1.Q3 + P1.Q4) AS YearTotal
FROM (SELECT Year,
SUM(CASE P.Quarter WHEN 1 THEN P.Amount ELSE 0 END) AS Q1,
SUM(CASE P.Quarter WHEN 2 THEN P.Amount ELSE 0 END) AS Q2,
SUM(CASE P.Quarter WHEN 3 THEN P.Amount ELSE 0 END) AS Q3,
SUM(CASE P.Quarter WHEN 4 THEN P.Amount ELSE 0 END) AS Q4
FROM Pivot AS P
GROUP BY P.Year) AS P1
GO
解决方案 »
- 急 啊!!
- ++有哪个高手能教我下EXISTS关键字到底怎么用啊+++
- 疑惑 为什么结果会有这样的呢。请大家帮忙看看??????????/
- 如何在表里面保存韩文?
- 第二天开计算机发现在桌面右下角的MSSQL服务器管理器小图表的绿色箭头变红色了,我打开服务器管理器点击“开始/继续”,还是没反应。请问
- SQL Server Management Studio的服务器类型列表中为何少东西了???
- 怎么把MS SQL 中的NULL值转换为一个特定值??请详细说明,本人菜鸟
- 看上去简单,实际很难
- SQL SERVER 7.0 事物提交失败
- SQL查询结果集问题,高手请进!
- 高分求一sql server 2000企业版cd-key
- 继续求查询语句!!!!!
use PostBag
go
-- =============================================
-- Create procedure basic template
-- =============================================
-- creating the store procedure
IF EXISTS (SELECT name
FROM sysobjects
WHERE name = N'pPostBagReqBranchDayDetail'
AND type = 'P')
DROP PROCEDURE pPostBagReqBranchDayDetail
GOCREATE PROCEDURE pPostBagReqBranchDayDetail
@dOperDate smalldatetime
AS
begin
--动态生成所有种类邮袋的请领报表
declare @nvcSqlString1 nvarchar(3000)
declare @nvcSqlString2 nvarchar(3000)
declare @nvcColumns nvarchar(20)
declare @nvcColumns2 nvarchar(20)
set @nvcSqlString1='create table ##tPostBagReqBranchDayDetail('+char(13)
set @nvcSqlString1=@nvcSqlString1+'BranchNo char(6)'+char(13)
begin DECLARE cDayDetail1 CURSOR FOR
SELECT cast(KindNo as nvarchar(20)) FROM PostBag.dbo.tPostBagKind
OPEN cDayDetail1
FETCH NEXT FROM cDayDetail1 into @nvcColumns
WHILE @@FETCH_STATUS = 0
BEGIN
set @nvcSqlString1=@nvcSqlString1+',Bag'+@nvcColumns+' smallint default 0 not null'+char(13) FETCH NEXT FROM cDayDetail1 into @nvcColumns
END
CLOSE cDayDetail1
DEALLOCATE cDayDetail1 set @nvcSqlString1=@nvcSqlString1+')' -- select @nvcSqlString1
EXEC sp_executesql @nvcSqlString1
insert ##tPostBagReqBranchDayDetail (BranchNo)
select distinct BranchNo from tPostBagRequire where PostSys.dbo.fnDate(OperDate)=@dOperDate
end-- select * from ##tPostBagReqBranchDayDetail begin DECLARE cDayDetail2 CURSOR FOR
SELECT cast(KindNo as nvarchar(20)) FROM PostBag.dbo.tPostBagKind OPEN cDayDetail2 FETCH NEXT FROM cDayDetail2 into @nvcColumns2
WHILE @@FETCH_STATUS = 0
BEGIN
set @nvcSqlString2=''
set @nvcSqlString2='update a'+char(13)
set @nvcSqlString2=@nvcSqlString2+'set '+'Bag'+@nvcColumns2+'=b.TotalNumber'+char(13)
set @nvcSqlString2=@nvcSqlString2+'from ##tPostBagReqBranchDayDetail a'+char(13)
set @nvcSqlString2=@nvcSqlString2++',PostBag.dbo.fnReqGrpBranchDayKind('+''''+left(convert(nvarchar(50),@dOperDate,20),10)+''''+')'+' b '+char(13)
set @nvcSqlString2=@nvcSqlString2+'where a.BranchNo=b.BranchNo and b.KindNo='+@nvcColumns2 EXEC sp_executesql @nvcSqlString2
-- select @nvcColumns2
-- select @nvcSqlString2 as aa FETCH NEXT FROM cDayDetail2 into @nvcColumns2
END
CLOSE cDayDetail2
DEALLOCATE cDayDetail2
end-- select * from ##tPostBagReqBranchDayDetail-- drop table ##tPostBagReqBranchDayDetail
end
GO
-- drop table ##tPostBagReqBranchDayDetail
goEXECUTE pPostBagReqBranchDayDetail '2002-7-17'
GO
insert into 表名 values('设备1', 20,0)
insert into 表名 values('设备2', 40,0)
insert into 表名 values('设备3', 50,0)
-----------------------------------------------------------------
declare @sql varchar(8000)set @sql = 'select '' ''='''''
update 表名
set @sql = @sql + ',max(case 名称 when '''+rtrim(名称)
+''' then '+cast(速度 as varchar(20))
+' else 0 end) as '''+ rtrim(名称)+''''
from 表名exec(@sql+' from 表名')
-----------------------------------------------------------