如何在SQL SERVER中实现类似ACCESS中的转折表(或交叉表)的功能,能否用SQL语句来实现?

czzw 2001-12-10 10:24:00
ACCESS的SQL 中有piovt选项,在SQL SERVER中是否也有类似的SQL语句?
...全文
49 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
蓝天 2001-12-12
  • 打赏
  • 举报
回复
给分??
蓝天 2001-12-11
  • 打赏
  • 举报
回复
Cross-tab Reports
Sometimes it is necessary to rotate results so that columns are presented horizontally and rows are presented vertically. This is known as creating a PivotTable®, creating a cross-tab report, or rotating data.

Assume there is a table Pivot that has one row per quarter. A SELECT of Pivot reports the quarters vertically:

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



A report must be produced with a table that contains one row for each year, with the values for each quarter appearing in a separate column, such as:

Year Q1 Q2 Q3 Q4
1990 1.1 1.2 1.3 1.4
1991 2.1 2.2 2.3 2.4



These are the statements to create the Pivot table and populate it with the data from the first table:

USE Northwind

GO



CREATE 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



This is the SELECT statement to create the rotated results:

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



This SELECT statement also handles a table in which there are multiple rows for each quarter. The GROUP BY combines all rows in Pivot for a given year into a single row in the output. When the grouping operation is being performed, the CASE functions in the SUM aggregates are applied in such a way that the Amount values for each quarter are added into the proper column in the result set and 0 is added to the result set columns for the other quarters.

If the results of this SELECT statement are used as input to a spreadsheet, it is easy for the spreadsheet to calculate a total for each year. When the SELECT is used from an application it may be easier to enhance the SELECT statement to calculate the yearly total, for example:

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



You may also want to consider GROUP BY with CUBE or with ROLLUP. Both compute the same sort of information, but in a slightly different format.

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧