当前位置: 网学 > 编程文档 > SQL SERVER > 正文

SQL Server 2005 Beta 2 Transact-SQL 增强功能(二)

来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/18
下载{$ArticleTitle}原创论文样式
derID, ProductID)
)
INSERT INTO OrdersFact
SELECT O.SalesOrderID, OD.ProductID, O.CustomerID,
YEAR(O.OrderDate) AS OrderYear, MONTH(O.OrderDate) AS OrderMonth,
DAY(O.OrderDate) AS OrderDay, OD.OrderQty
FROM Sales.SalesOrderHeader AS O
JOIN Sales.SalesOrderDetail AS OD
ON O.SalesOrderID = OD.SalesOrderID

要获得每个年份和月份的总数量,并且在行中返回年份,在列中返回月份,则请使用以下查询:

SELECT *
FROM (SELECT OrderYear, OrderMonth, Quantity
FROM OrdersFact) AS ORD
PIVOT
(
SUM(Quantity)
FOR OrderMonth IN(,,,,,,,,,,,)
) AS PVT

以下为结果集:

OrderYear 1 2 3 4 5 6 7 8 9 10 11 12
---------- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----
2001 NULL NULL NULL NULL NULL NULL 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 NULL NULL NULL NULL NULL

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

SELECT OrderYear,
ISNULL(, 0) AS M01,
ISNULL(, 0) AS M02,
ISNULL(, 0) AS M03,
ISNULL(, 0) AS M04,
ISNULL(, 0) AS M05,
ISNULL(, 0) AS M06,
ISNULL(, 0) AS M07,
ISNULL(, 0) AS M08,
ISNULL(, 0) AS M09,
ISNULL(, 0) AS M10,
ISNULL(, 0) AS M11,
ISNULL(, 0) AS M12
FROM (SELECT OrderYear, OrderMonth, Quantity
FROM OrdersFact) AS ORD
PIVOT
(
SUM(Quantity)
FOR OrderMonth IN(,,,,,,,,,,,)
) 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(,,,,,,,,)
) 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 N

网学推荐

免费论文

原创论文

浏览:
设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
湘ICP备09003080号