e股脑电脑教程网
  • 首 页
  • 操作系统
  • 应用软件
  • 下载工具
  • 影音视频
  • 办公软件
  • 媒体制作
  • 网站建设
  • 平面设计
  • 数据库
  • 程序开发
  • 视频教程
编辑推荐: | 文章搜索:
您现在的位置: e股脑 >> 数据库 >> Mssql教程 >> SQL Server 2005 Beta 2 Transact-SQL 增强功能 2 >> 教程正文
 
教程搜索
 
 
相关教程
  • 你知道MySQL10条鲜为人知的技巧吗?
  • 你应该知道的10个MySQL客户启动选项
  • 用特殊的MySQL运算符获得更多数据比较
  • MySQL数据库中与 NULL值有关的几个问题
  • 教你快速了解公共MySQL的数据库服务器
  • MySQL 5.0在windows上的安装详细介绍
  • MySQL查询的性能优化
  • Linux操作系统中如何安装MySQL数据库
  • 23道安全门加铸MySQL数据库
  • MySQL 5.0 数据库新特性的存储过程
  • 从Windows命令行启动MySQL
  • 连接MySQL数据库失败频繁的原因
  • 加速动态网站 MySQL索引分析和优化
  • 轻松掌握如何保护MySQL中的重要数据
  • 快速掌握MySQL数据库中Show命令的用法
  • MySQL数据库的安全配置实用技巧
 
 

图文教程


  • Windows抢了谁的饭碗 非主流操作系统To

  • 地球还是火星 平常心看“非主流”

  • 综合运用Office 2007批量制作奖状

  • 没有系统盘如何才能修复受损系统?

  • 巧妙运用Excel中边界的附加功能!
 
 
赞 助 商
 
 
SQL Server 2005 Beta 2 Transact-SQL 增强功能 2
  • 来源:e股脑
  • 点击次数:
  • 更新时间:2007-8-9
314 12239 15656 15805 2209 NULL NULL NULL NULL NULL

对于年份和月份之间不存在的交点,PIVOT 返回空值。如果某个年份出现在输入表表达式(派生表 ORD )中,则它会出现在结果中,而不管它是否与任何指定的月份存在交点。这意味着,如果您未指定所有现有月份,则可能获得在所有列中都含有 NULL 的行。但是,结果中的空值未必代表不存在的交点。它们可能产生自数量列中的基础空值,除非该列不允许使用空值。如果您希望重写 NULL 并且改而考虑另一个值(例如 0),则可以通过在选择列表中使用 ISNULL() 函数做到这一点:


SELECT OrderYear, ISNULL([1], 0) AS M01, ISNULL([2], 0) AS M02, ISNULL([3], 0) AS M03, ISNULL([4], 0) AS M04, ISNULL([5], 0) AS M05, ISNULL([6], 0) AS M06, ISNULL([7], 0) AS M07, ISNULL([8], 0) AS M08, ISNULL([9], 0) AS M09, ISNULL([10], 0) AS M10, ISNULL([11], 0) AS M11, ISNULL([12], 0) AS M12 FROM (SELECT OrderYear, OrderMonth, Quantity FROM OrdersFact) AS ORD PIVOT ( SUM(Quantity) FOR OrderMonth IN([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12]) ) AS PVT

以下为结果集:

OrderYear 1 2 3 4 5 6 7 8 9 10 11 12 ---------- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- 2001 0 0 0 0 0 0 966 2209 1658 1403 3132 2480 2002 1040 2303 1841 1467 3179 2418 7755 11325 9066 5584 8268 6672 2003 3532 5431 4132 5694 8278 6444 11288 18986 18681 11607 14771 15855 2004 9227 10999 11314 12239 15656 15805 2209 0 0 0 0 0

在派生表中使用 ISNULL(Quantity, 0) 时,只会处理 Quantity 列中的基础空值(如果该列存在),而不会处理 PIVOT 为不存在的交点生成的空值。

假设您希望针对 2003 年和 2004 年的第一个季度中的年份值和月份值组合返回范围 1 到 9 中的每个客户 ID 的总数量。要在行中获得年份值和月份值,在列中获得客户 ID,请使用以下查询:

SELECT * FROM (SELECT CustomerID, OrderYear, OrderMonth, Quantity FROM OrdersFact WHERE CustomerID BETWEEN 1 AND 9 AND OrderYear IN(2003, 2004) AND OrderMonth IN(1, 2, 3)) AS ORD PIVOT ( SUM(Quantity) FOR CustomerID IN([1],[2],[3],[4],[5],[6],[7],[8],[9]) ) AS PVT

以下为结果集:

OrderYear OrderMonth 1 2 3 4 5 6 7 8 9 ----------- ----------- ---- ---- ---- ---- ---- ---- ---- ---- ---- 2003 1 NULL NULL NULL 105 NULL NULL 8 NULL NULL 2004 1 NULL NULL NULL 80 NULL NULL NULL NULL NULL 2003 2 NULL 5 NULL NULL NULL NULL NULL NULL 15 2004 2 NULL 10 NULL NULL NULL NULL NULL 6 3 2003 3 NULL NULL 105 NULL 15 NULL NULL NULL NULL 2004 3 NULL NULL 103 NULL 25 4 NULL NULL NULL


在该示例中,隐含的 group-by 列表为 OrderYear 和 OrderMonth ,因为 CustomerID 和 Quantity 分别被用作枢轴列和值列。

但是,如果您希望年份值和月份值的组合显示为列,则必须首先自己串联它们,然后再将它们传递给 PIVOT 运算符,因为只能有一个枢轴列:

SELECT * FROM (SELECT CustomerID, OrderYear*100+OrderMonth AS YM, Quantity FROM OrdersFact WHERE CustomerID BETWEEN 1 AND 9 AND OrderYear IN(2003, 2004) AND OrderMonth IN(1, 2, 3)) AS ORD PIVOT ( SUM(Quantity) FOR YM IN([200301],[200302],[200303],[200401],[200402],[200403]) ) AS PVT

以下为结果集:

CustomerID 200301 200302 200303 200401 200402 200403 ---------- ------ ------ ------ ------ ------ ------ 2 NULL 5 NULL NULL 10 NULL 3 NULL NULL 105 NULL NULL 103 6 NULL NULL NULL NULL NULL 4 4 105 NULL NULL 80 NULL NULL 8 NULL NULL NULL NULL 6 NULL 5 NULL NULL 15 NULL NULL 25 7 8 NULL NULL NULL NULL NULL 9 NULL 15 NULL NULL 3 NULL

UNPIVOT

UNPIVOT 运算符使您可以标准化预先旋转的数据。UNPIVOT 运算符的语法和元素与 PIVOT 运算符类似。

例如,请考虑上一节中的 AuctionItems 表:

itemid itemtype whenmade initialprice ----------- ------------------------ ----------- -------------- 1 Wine 1822 3000.0000 2 Wine 1807 500.0000 3 Chair 1753 800000.0000 4 Ring -501 1000000.0000 5 Painting 1873 8000000.0000 6 Painting 1889 8000000.0000

假设您希望每个属性出现在不同的行中(类似于在 ItemAttributes 表中保存属性的方式):

itemid attribute value ----------- --------------- ------- 1 itemtype Wine 1 whenmade 1822 1 initialprice 3000.00 2 itemtype Wine 2 whenmade 1807 2 initialprice 500.00 3 itemtype Chair 3 whenmade 1753 3 initialprice 800000.00 4 itemtype Ring 4 whenmade -501 4 initialprice 1000000.00 5 itemtype Painting 5 whenmade 1873 5 initialprice 8000000.00 6 itemtype Painting 6 whenmade 1889 6 initialprice 8000000.00


在 UNPIVOT 查询中,您希望将列 itemtype 、whenmade 和 initialprice 旋转到行。每个行都应当具有项 ID、属性和值。您必须提供的新的列名称为 attribute 和 value 。它们对应于 PIVOT 运算符中的 pivot_column 和 value_column。attribute 列应当获得您希望旋转的实际列名称(itemtype 、whenmade 和 initialprice )作为值。value 列应当将来自三个不同源列中的值放到一个目标列中。为了有助于进行说明,首先介绍一个无效的 UNPIVOT 查询版本,然后介绍一个应用了某些限制的有效版本:

SELECT itemid, attribute, value FROM AuctionItems UNPIVOT ( value FOR attribute IN([itemtype], [whenmade], [initialprice]) ) AS UPV

作为 PIVOT 运算符的参数,您为后面跟 FOR 子句的 value_column(在该示例中为 value )提供一个名称。在 FOR 子句后面,为 pivot_column(在该示例中为 attribute )提供一个名称,然后提供一个 IN 子句,其中带有您希望获得以作为 pivot_column

上一页  1 2 3 4 5 6 7 8 9 10  ... 下一页  >> 
  • 上一篇教程: SQL Server 2005 中的分区表和索引
  • 下一篇教程: 在 SQL Server 2005 Beta 2 中编辑 Transact-SQL 代码
  •  

    关于本站 | 广告联系 | 版权声明 | 使用帮助

    Copyright © 2004-2008 www.egunao.com All rights reserved.