Transact-SQL Cookbook第一章数据透视表1.1使用数据透视表1.1.1 问题支持一个元素序列往往需要解决各种问题。
例如,给定一个日期范围,你可能希望产生一行在每个日期的范围。
或者,您可能希望将一系列的返回值在单独的行成一系列单独的列值相同的行。
实现这种功能,你可以使用一个永久表中存储一系列的顺序号码。
这种表是称为一个数据透视表。
许多食谱书中使用数据透视表,然后,在所有情况下,表的名称是。
这个食谱告诉你如何创建表。
1.1.2 解决方案首先,创建数据透视表。
下一步,创建一个表名为富,将帮助你在透视表:CREATE TABLE Pivot (i INT,PRIMARY KEY(i))CREATE TABLE Foo(i CHAR(1))富表是一个简单的支持表,你应插入以下10行:INSERT INTO Foo VALUES('0')INSERT INTO Foo VALUES('1')INSERT INTO Foo VALUES('2')INSERT INTO Foo VALUES('3')INSERT INTO Foo VALUES('4')INSERT INTO Foo VALUES('5')INSERT INTO Foo VALUES('6')INSERT INTO Foo VALUES('7')INSERT INTO Foo VALUES('8')INSERT INTO Foo VALUES('9')利用10行在富表,你可以很容易地填充枢轴表1000行。
得到1000行10行,加入富本身三倍,创建一个笛卡尔积:INSERT INTO PivotSELECT f1.i+f2.i+f3.iFROM Foo f1, Foo F2, Foo f3如果你名单上的行数据透视表,你会看到它所需的数目的元素,他们将编号从0到999。
1.1.3讨论你会看到食谱,跟随在这本书中,枢轴表通常是用来添加一个排序属性查询。
某种形式的数据透视表中发现许多数据库为基础的系统,尽管它往往是隐藏的用户,主要用在预定义的查询和程序。
你已经看到一些表连接(的富表)控制的行数,我们插入语句生成的数据透视表。
从0到999的值是通过连接生成的字符串。
数字值,是字符串。
因此,当加号(+)运算符用来串连,我们得到的结果如下:'0' + '0' + '0' = '000''0' + '0' + '1' = '001这些结果是插入整数列在目的地的数据透视表。
当你使用一个插入语句插入字符串到整数列的数据库,含蓄地转换成整数的字符串。
笛卡尔积富情况下确保所有可能的组合生成,和,因此,所有可能的值从0到999的产生。
这是值得指出的,这个例子使用行从0999和负数。
你可以很容易地产生负面的号码,如果需要,重复插入声明“-”符号前面的连接字符串,小心点大约0排。
有没有这样的事,作为一个- 0,所以你不想将' 000 '行时产生的负轴数。
如果你这样做,你最终会与0行的数据透视表。
在我们的例子中,0行是不可能的,因为我们定义一个主键的透视表。
枢轴表可能是最有用的表中的世界。
一旦你使用它,它几乎是不可能创造一个严重的应用没有它。
作为一个示范,让我们用枢轴表生成一个图表迅速从32码到126:SELECT i Ascii_Code, CHAR(i) Ascii_Char FROM PivotWHERE i BETWEEN 32 AND 126Ascii_CodeAscii_Char----------- ----------3233 !34 "35 #36 $37 %38 &39 '40 (41 )42 *43 +44 ,45 -46 .47 /48 049 150 251 3...如何更好的使用数据透视表在这个特定的例子是你产生行输出不具有同等数量的行输入。
没有数据透视表,这是困难的,如果不是不可能的任务。
简单的指定一个范围,然后选择枢轴行在该范围内,我们能够产生的数据,不存在任何数据库中的表。
作为另一个例子,数据透视表的有用性,我们可以很容易地使用它来生成一个日历的下一个七天:SELECTCONVERT(CHAR(10),DATEADD(d,i,CURRENT_TIMESTAMP), 121) date, DATENAME(dw,DATEADD(d,i,CURRENT_TIMESTAMP)) day FROM PivotWHERE i BETWEEN 0 AND 6date day---------- ------------------------------2001-11-05 Monday2001-11-06 Tuesday2001-11-07 Wednesday2001-11-08 Thursday2001-11-09 Friday2001-11-10 Saturday2001-11-11 Sunday这些查询只是快速震荡,列在这里向您展示如何一个数据透视表可用于查询。
你会看到其他的食谱,枢轴表往往是一个必不可少的工具,为快速有效的解决问题。
第二章集结构化查询语言,作为一种语言,是围绕这一概念集。
你可能记得在小学学习,或者也许你研究套代数在高中或大学。
虽然语句如选择,更新,删除和可用于在一个数据行在一个时间,该报表设计运行数据集,且你获得最好的优势时,使用这种方式。
尽管这一切,我们通常看到的程序,使用操纵数据一次一行,而不是采取优势的强大的订珠加工能力。
我们希望,这一章,我们可以打开你的眼睛的力量,集合操作。
当你写语句,不知道对程序,选择一个记录,更新它,然后选择另一个。
相反,认为无论在经营上的记录集,一下子。
如果你使用的程序性思维,思维可以采取一些习惯。
为了帮助你,这一章提出了一些食谱表明权力的一套面向编程方法与结构化查询语言。
食谱,在本章的组织表现出不同类型的操作,可以进行设置。
你会看到如何找到共同的要素,总结的一组数据,并找出元素集是一个极端。
行动不一定符合数学定义的集合运算。
相反,我们这些定义和解决现实世界的问题,用代数术语。
在现实世界中,有些偏离严格的数学定义是必要的。
例如,它往往是必要的元素的集合,一个操作是不可能的数学定义集。
2.1简介潜水前的食谱,我们想通过一些基本步骤作了简要的概念和定义的术语在本章。
虽然我们相信你所熟悉的数学概念,交叉口,和工会,我们想把这些set-algebra条款纳入一个现实世界的例子。
2.1.1部件有三种类型的部件时应注意工作组。
第一个是自己设定的。
一个集合是一个集合的元素,和,为我们的宗旨,元素是数据库表中的行或列的查询返回的。
最后,我们的宇宙,这是我们长期使用参考的所有可能的元素为一组给定。
2.1.1.1集一个集合是一个集合的元素。
根据定义,内容不得复制,和他们没有命令。
在这里,数学定义的一组不同于其实际使用中的语言。
在现实世界中,它往往是有益的排序集合的元素到一个指定的顺序。
这样做可以让你找到极端等五大,或底部五,记录。
图2 - 1显示了一例2套。
我们会提到这些例子,我们讨论的各个方面的术语。
我们的目的,我们将考虑一组是一个收集表中的行确定一个共同的元素。
考虑,例如,下面的表项。
这张桌子是一家集集,其中每个集是一个独特的标识order-identification数。
CREATE TABLE OrderItems(OrderId INTEGER,ItemId INTEGER,ProductIdCHAR(10),Qty INTEGER,PRIMARY KEY(OrderId,ItemId))每一集都在这个案件是一个秩序和有很多元素,不重复。
将元素行定义产品的数量和这些产品被命令。
常见的元素是订单列。
使用SQL,很容易从一组列表中的所有元素。
你只是问题的一条语句的选择与确定一套具体的利益。
以下查询将返回所有单项记录集合中的顺序确定的:SELECT * FROM OrderItems WHERE OrderId=112在这一章中,我们将与集,总是在一个表。
许多作者试图证明集合操作使用不同的表。
这个方法有2个问题。
首先,从实证角度而有利,你很少会发现一个数据库表,都具有相同的结构。
其次,有许多隐藏的可能性书面查询来当你认为不同的设置为不同的片同表。
通过集中在一个表,我们希望能打开你的心,这些可能性。
2.1.1.2元素一个元素是一个成员的一组。
图2 - 1,每一个人的信是一个元素。
我们的目的,工作时,一个元素是一个行的表。
结构化查询语言,它往往是有益的,不认为元素统一实体。
在纯数学意义上来说,这是不可能的,一个集合的元素划分为2个或多个组件。
结构化查询语言,然而,你可以分为组成元素。
一个表通常是由许多不同的栏目,你就会经常查询写入操作只有一个子集,这些列。
例如,让我们说,你想找到的所有订单,包含一个炸药,无论数量。
你的元素排在orderitems表。
你需要使用产品编号列识别爆炸物,你会需要返回订单列确定的订单,但你没有使用其他表中的列。
这里的查询:SELECT OrderIdFROM OrderItems oGROUP BY OrderIdHAVING EXISTS(SELECT *FROM OrderItems o1WHERE o1.ProductId='Explosive' AND o.OrderId=o1.OrderId) 此查询实际使用的一组操作,你会读到这一章。
操作称为包含操作,和它对应的查询关键字的存在。
2.1.1.3合集一个合集的所有可能的元素可以是一个给定的集合。
考虑1和2图。
每一集是由字母的字母表。
如果我们决定,只有字母可以设置元素,宇宙的两队会设置的所有信件,如图2 - 2所示。
一个更现实的例子一个宇宙,认为一个学校课程的学生提供40种可能。
每个学生选择一个小数目40课程采取在某一学期。
课程内容。
本课程,使学生正在制定一套。
不同的学生采取不同的组合和数量的课程。
该集是不一样的,也不是所有大小相同,但他们都包含元素相同的宇宙。
每个学生必须选择从相同的40种可能性。
在学生/课程的例子了,所有的元素都来自同一个宇宙。
它也可能为一些套在一个表有不同的宇宙人。
例如,假设一个表列出完成案例研究,学生提出了。
进一步假设,宇宙可能的情况是不同的每个过程研究。
如果你认为一套定义一个课程和学生,宇宙的元素,将取决于课程的学生。