现在的位置: 首页 > 综合 > 正文

SQL2005之后MS SQL版本 T-SQL 新增语法、函数(三)

2012年12月09日 ⁄ 综合 ⁄ 共 3891字 ⁄ 字号 评论关闭

 

       1.DECLARE语句在声明变量时可以赋默认值,而且支持赋值运算符如"+=,-=,/=,*=,%="等。

          eg.

              declare @test int =2

              set @test+=5

       2. 行插入   允许一个insert语句插入多个值

          eg.

               create table test (id int,name nvarchar(20))

               insert into test values (1,'hacker'),(2,'lily'),(3,'mary')

       3.MERGE函数  这是sqlserver 20008新增的一个函数,在数据的批量处理方面很有效。主要用于合并两个行集数据,使用MERGE语句

       用一个SQL语句就可以完成根据一个源数据表对另一个数据表进行确定性的插入、更新和删除这样复杂的操作,而且效率还比较高。

       eg.

       merge [target] t
       using [source] s on t.id = s.id
       when matched then update t.name = s.name, t.age = s.age

       when not matched then insert values(id,name,age)   

       sqlserver 2008联机文档中更详细的例子。 

       4. APPLY

              使用 APPLY 运算符可以为实现查询操作的外部表表达式返回的每个行调用表值函数。表值函数作为右输入,外部表表达式作为左输入。

       通过对右输入求值来获得 左输入每一行的计算结果,生成的行被组合起来作为最终输出。APPLY 运算符生成的列的列表是左输入中的列集,

       后跟右输入返回的列的列表。

              APPLY 语法: 外部表达式(select等语句查询出的结果集) + CROSS/OUTER APPLY + 表值函数(返回值是table类型的function)

              其实APPLY相当于左边的结果集与右边的结果集(左边每一行调用表值函数返回的数据的并集)进行left join,而其又分为cross apply和

       outer apply两种形式,前者返回的结果集中不包含调用表值函数返回为空的数据(这与left join有点出入)而后者则包括(其实就是左边结果集和

       右边结果集的left join)。

       5. PIVOT/UNPIVOT (转自http://technet.microsoft.com/zh-cn/library/ms177410.aspx

              可以使用 PIVOT 和 UNPIVOT 关系运算符将表值表达式更改为另一个表。PIVOT 通过将表达式某一列中的唯一值转换为输出中的多个列

       来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执行聚合。UNPIVOT 与 PIVOT 执行相反的操作,将表值表达式的列转换为列值。

           PIVOT语法: (这个比联机文档中的更好理解一些)

                  SELECT <非透视的列>,

                  [第一个透视的列] AS <列名称>,

                  [第二个透视的列] AS <列名称>,

                  ...

                  [最后一个透视的列] AS <列名称>,

                  FROM

                  (<生成数据的 SELECT 查询>)

                  AS <源查询的别名>

                  PIVOT

                  (

                       <聚合函数>(<要聚合的列>)

                       FOR

                      [<包含要成为列标题的值的列>]

                      IN ( [第一个透视的列], [第二个透视的列],

                      ... [最后一个透视的列])

                   ) AS <透视表的别名>

                   <可选的 ORDER BY 子句>;

下面的代码示例生成一个两列四行的表。

USE AdventureWorks2008R2 ;
GO
SELECT DaysToManufacture, AVG(StandardCost) AS AverageCost 
FROM Production.Product
GROUP BY DaysToManufacture;

 

下面是结果集:

DaysToManufacture          AverageCost

0                          5.0885

1                          223.88

2                          359.1082

4                          949.4105

没有定义 DaysToManufacture 为 3 的产品。

以下代码显示相同的结果,该结果经过透视以使 DaysToManufacture 值成为列标题。提供一个列表示三 [3] 天,即使结果为 NULL

-- Pivot table with one row and five columns
SELECT 'AverageCost' AS Cost_Sorted_By_Production_Days, 
[0], [1], [2], [3], [4]
FROM
(SELECT DaysToManufacture, StandardCost 
    FROM Production.Product) AS SourceTable
PIVOT
(
AVG(StandardCost)
FOR DaysToManufacture IN ([0], [1], [2], [3], [4])
) AS PivotTable;

 

下面是结果集:

Cost_Sorted_By_Production_Days    0         1         2           3       4       

AverageCost                       5.0885    223.88    359.1082    NULL    949.4105

 

 

UNPIVOT 将与 PIVOT 执行几乎完全相反的操作,将列转换为行。假设以上示例中生成的表在数据库中存储为 pvt,并且您需要将列标识符 Emp1Emp2Emp3Emp4Emp5 旋转为对应于特定供应商的行值。这意味着必须标识另外两个列。包含要旋转的列值(Emp1Emp2...)的列将被称为 Employee,将保存当前位于待旋转列下的值的列被称为 Orders。这些列分别对应于 Transact-SQL 定义中的 pivot_columnvalue_column。以下为该查询。

--Create the table and insert values as portrayed in the previous example.
CREATE TABLE pvt (VendorID int, Emp1 int, Emp2 int,
    Emp3 int, Emp4 int, Emp5 int);
GO
INSERT INTO pvt VALUES (1,4,3,5,4,4);
INSERT INTO pvt VALUES (2,4,1,5,5,5);
INSERT INTO pvt VALUES (3,4,3,5,4,4);
INSERT INTO pvt VALUES (4,4,2,5,5,4);
INSERT INTO pvt VALUES (5,5,1,5,5,5);
GO
--Unpivot the table.
SELECT VendorID, Employee, Orders
FROM 
   (SELECT VendorID, Emp1, Emp2, Emp3, Emp4, Emp5
   FROM pvt) p
UNPIVOT
   (Orders FOR Employee IN 
      (Emp1, Emp2, Emp3, Emp4, Emp5)
)AS unpvt;
GO

 

以下为部分结果集。

VendorID Employee Orders

---------- ---------- ------

1          Emp1       4

1          Emp2       3

1          Emp3       5

1          Emp4       4

1          Emp5       4

2          Emp1       4

2          Emp2       1

2          Emp3       5

2          Emp4       5

2          Emp5       5

...

请注意,UNPIVOT 并不完全是 PIVOT 的逆操作。PIVOT 会执行一次聚合,从而将多个可能的行合并为输出中的单个行。而 UNPIVOT 不会重现原始表值表达式的结果,因为行已经被合并了。另外,UNPIVOT 的输入中的空值不会显示在输出中,而在执行 PIVOT 操作之前,输入中可能有原始的空值。

 

          

 

 

 

 

 

抱歉!评论已关闭.