数据库透视 - 目的是什么?

时间:2012-07-24 05:30:06

标签: database pivot

为什么有人想要将列转换为行(即旋转)?它解决了哪个问题?

我找到了一些链接,但没有得到满意的答案。

http://codeghar.wordpress.com/2007/11/03/pivot-tables/

http://msdn.microsoft.com/en-us/library/ms177410%28SQL.105%29.aspx

3 个答案:

答案 0 :(得分:7)

通常,这是因为布局在旋转后的报表或用户界面中效果更好。

规范化数据库上的数据可能会导致多个记录的“形状”中的数据,其中UI希望将这些记录视为字段。数据规范化很棒,但是当以简洁,自然的格式表示数据时,通常需要旋转。

example here

当然,我链接的示例是Excel,而不是真正的数据库,但图片描述了一个示例,其中透视数据看起来更自然,概念是相同的。

答案 1 :(得分:5)

关于你的问题“为什么有人想要将列转换为行(即旋转)?它解决了哪个问题?”

这不是“数据看起来如何”的问题,而是“如何组织和处理”。即:

在大多数数据库中,行表示“记录 - (实体,事件等)”和列“字段(该实体的属性)”。例如,下面是数据的典型数据库表示;

Person      |  Birth | Height |
-------------------------------
John        |   1980 |  1.82  |
Smith       |   1987 |  2.02  |

这意味着;每列代表“人物”的特定属性,当您选择特定列时,您将获得所有人的特定属性。这样,列是“维度”,所有值都具有相同的单位(数据类型),所有都是日期,都是长度等。

然而,在财务建模中,以相反的方式表示数据非常方便。例如,“每月现金流”表中的典型表格如下所示。

Item         |  Jan |   Feb |
-----------------------------
Sales        | $100 |  $150 |
Tax          | -$50 |  -$15 |

请注意,电子表格中的此类表格不符合数据库格式,列标题是时间,但列中的值是货币值,CONFLICT,我们无法使用此列进行计算。

如果我们PIVOT这个表,它就变成了

Date         | Sales |  Tax  |
------------------------------
Jan          |  $100 |  -$50 |
Feb          |  $150 |  -$15 |  

现在,列维度(标题)和它们内部的数据是一致的。 日期列包含所有日期,其他日期列出所有$数字。我们可以使用列并使用它进行向量操作。

这是旋转解决的一个问题。

答案 2 :(得分:2)

这是一个例子吗?

How to PIVOT Data Using T-SQL

  

数据提取的一个共同期望是转换的能力   多行输出到一行中的多个列。 SQL   Server 2005/2008提供了使用PIVOT执行此操作的功能   查询中的运算符。

修改

假设您有一张表按日期存储每位客户的销售额

这样的东西
Table
- SaleDate
- CustomerID
- SaleAmount

使用PIVOT,您可以按月/季度/年显示总计每个客户的销售额的网格

    |Client A|Client B|Client C
--------------------------------
2007| 100    | 0      | 150
2008| 0      | 200    | 160
2009| 110    | 180    | 100

这纯粹是出于简要目的。