联系使用Excel和SQL
 

当今,许多公司都使用SQL Server来处理关于产品、服务和支持方面的数据――所有那些你能够想象得到的数据。通常,安装有SQL Server的公司都同时安装有非常庞大和贵重的软件应用程序,这些应用程序是用来从数据库中插入和查找数据用的。当这些应用程序能够确实起到一些作用的时候,并且这些程序需要在不同的情况下将数据导入到SQL Server的环境下,如何生成报表就成了一个问题。

对于大多的用户来说,将SQL Server中的数据创建一个报表显示出来是非常直观的、显而易见的。通过使用简单的操作,你就可以创建一个代表当前SQL Server数据的文档给你的用户,而你的用户并没有意识到这些数据是存储在一个庞大的数据库中的,并且有许多的数据支持着它的存在。这时,你就可以通过使用Excel电子表格来显示更多的相关数据,下面就是如何操作的步骤:

 作者提示

这篇文章是基于两个软件的――SQL Server 和 Excel。这篇文章会帮助你了解如何将这两个软件天衣无缝地衔接起来,来进行数据的输出。通过这种方法,你所提供的报表和信息将帮助他们更有效地进行工作,并且可以减少用户们求助公司DBA的频率。

为了明确表达这篇文章的目的,我将使用SQL Server 2000的Evaluation版和Office XP。你至少需要安装微软的SQL Server 的运行版本和微软的Excel或者Office。我将使用Northwind数据库,它是在SQL Server标准版和企业版中都包含有的数据库。这个数据库对于微软的Access也是适用的

一些小的先决条件

大多的办公环境都使用微软的Office产品,所以安装Excel应该不成问题。然而,安装SQL Server则要花费一个大代价,并且,如果你的公司并没有交付SQL Server的使用费用,并且也没有意愿要交付SQL Server的使用费用,这或许是一件麻烦的事情,但是,不要担心。微软创建了一个桌面版本,可以免费下载使用。它可以支持更高版本的数据,但是不提供所有有关设计数据库方面的工具。

在Excel中创建有用的报表,首先需要进行的第一个步骤就是获取那些每天使用Excel的人群的意见。例如,当用户从某个特定的部门出来的时候,你可以问他几个问题,或者寻求一些帮助;如果他们在报表或者获取数据方面有些问题,那么,这个解决方案也许就会提供相应的解决方法。在下面的步骤中,我将创建一个快速报表给Phil,他是一个市场部的雇员,这个报表中将包括购买Sasquatch Ale的用户信息和购买数量。

在SQL Server中获取数据

在你收集完适量的信息之后,就可以开始对这些数据进行处理了。通过我的经验,我发现创建一个Excel报表的最好的方式就是在Microsoft Query Analyzer 中创建这个报表,或者使用Office自带的一些工具,如Microsoft Query,测试它们的有效性,而不完全依赖与它的向导。

如果你生成的报表需要从许多数据库表格中获取堆积成山的数据,那么,从SQL Server中获取数据信息就将会变得非常困难。如果你需要访问种类繁多的数据库表格,那么,使用Query 向导也许会是创建报表的一个好的选择。它允许在SQL语句包括注释,那么,在你不干的时候,你就可以让其他人接手你的工作,或者,在某些情况下,可以接着创建一些查询。

报表显示了哪些顾客购买了Sasquatch Ale,并且显示了每个顾客购买的数量,这个报表关联到一个查询语句和四个数据库表格:Customers, Orders, Products, 和Order Details。这个关系到三个表格的查询语句也许最初看起来会有些复杂,特别是当你创建了你自己的SQL语句的时候;但是,你会发现,它并不是我们所想的那样。

如果你单独查看每个元素,并且通过其它的语言将它凑合到一起,它会立即按顺序排列。如果要查找顾客的信息、公司信息和联系姓名,你就需要从Customers 表格中选择这些信息。这个表格同时还包括了customer ID,这个ID信息就可以使得用户按顺序访问顾客信息。

在Orders表格中,包括顺序的ID信息和customer ID。这两个ID信息应该被看作是你选择信息的一个方法。当你不需要显示Orders 表格中的任何信息的时候,你必须做一个pit stop,来获取order ID 。一旦这通过一个简单的连接语句实现了,你就可以选择按照每个顾客购买数量的顺序排放,通过其他的连接语句,还可以按购买日期排列。

最后一个连接语句就是关于Products表,按照姓名和产品顺序排放。下面是选择语句代码的编写顺序:
-- 查找定购了Sasquatch Ale 的顾客,他们定购的数量和定购日期
-- 告知SQL Server你的查询应该选择的数据库。默认选择的是Master 数据库
使用northwind数据库
-- 创建一个选择表格中需要列的查询语句
select cust.companyname, cust.contactname, orddet.quantity, ord.orderdate, prod.productname
from customers cust inner join orders ord on cust.customerid = ord.customerid inner join [order details] orddet on ord.orderid = orddet.orderid inner join products prod on orddet.productid = prod.productid
where prod.productname = 'Sasquatch Ale'

上面代码例子的输出结果在A中显示:

这些表格按照同样的列进行连接。例如,Customers 和 Orders表格是按照customer ID来进行连接操作的:
inner join orders ord on cust.customerid = ord.customerid

这些表格同样还有它们名字的一些别名。这些别名可以使代码变得简单,我通常使用cust来代替customers,使用ord来代替orders。那么,当我要使用Customers表格中的contactnamn列或者Orders表格中的orderdate的时候,我就可以使用cust.contactname ord.orderdate通过使用这种方法,可以使得查询语句变得简练一些。当你正在创建大量的数据查询语句的时候,一些关键字可能会非常起作用。

这个查询语句并不简单。它需要连接四个表格来查找需要的数据。同时,在上面的查询代码中,跟在Where从句后面,我可以添加order by ord.orderdate,这样就可以使输出结果按照定购时间顺序排列。

如何在Excel中使用它

现在,我将会从Excel的角度看这条查询语句。在Excel中,选择Data ->Import External Data ->Select New Database Query。当你选择了New Database Query 菜单选项的时候,你将看到如图B所示的界面,它会让你选择一个DSN。

 
如果没有创建一个SQL Server的DSN怎么办?简单地选择界面中右侧的OK按钮,选择默认的信息。#p#DSN, DNS, ODBC:这些是什么意思?

当你使用Excel连接到SQL Server上的时候,你就创建了一个开放数据库连接(Open Database Connectivity (ODBC) )连接到数据库上。这些连接和数据源姓名(Data Source Names (DSNs))相关,有时也被误写为DNS,做为在英特网上使用的区域名。

选择界面右侧的OK按钮。你将会看到打开了一个创建新的数据源的向导,如图C所示:

 
你可以自己定义DSN的姓名,并且选择你连接的数据源类型。在这种情况下,点击下拉菜单,选择最后一个数据源(SQL Server),然后点击Connect按钮。

在SQL Server登陆界面中,你需要指定你的SQL Server 2000服务器机器的名字,同时还要输入登陆密码,以允许你的DSN成功地连接到SQL Server上。如果你的数据库服务器使用的是Windows的帐号和密码授权,选中Use Trusted Connection的复选框,然后点击OK。这种连接方式在图D中显示出来:

 
如果你的SQL Server使用SQL来进行登陆的,或者用户帐号是在SQL Server中创建的,那么,你就需要考虑来创建一个只读的SQL登陆帐号给其它的程序使用。如果你已经创建了一个帐号了,键入登陆名和密码,然后点击OK。

如果你需要确保你的数据源在如图D进行登陆的时候,总是能够连接到合适的数据库中去,你可以点击Options按钮,并且选择默认的数据库。在这种情况下,数据库就会是Northwind。然后点击OK,并且进行向导的下一个步骤。当这个步骤不是必须的时候,它可能会使得这个过程更容易一些。图E显示了如何进行选择。
 
接下来向导会使用你给定的确认信息建立数据库的连接,并且会询问你是否希望给这个DSN指定一个表格,如图C中显示的一样。你用不着填写这些信息。因为你的查询将使用到多个表格,所以没有必要去指定特定的一个表格。保存用户名和密码,如果你创建了一个SQL的登陆信息作为只读用的,那么将它们(用户名和密码)作为DSN的一部分保存起来是一个比较好的主意;这样,你在进行报表处理的时候,就不需要特地填充用户名和密码了。

一旦你填充了所有的必要部分,点击OK按钮。这时就会返回到你选择A数据源的界面,但是这一次,在你的列表中就会显示有你所创建的新的DSN信息。选择你所创建的DSN信息,并且点击OK按钮。

在下一个界面中,你就会见到如图F所示的查询向导。在这里,你可以展开表格前面的“+”号,通过高亮化你希望选择的列来选择默认的数据库中表格的某几列(如果你事前选择了一个数据库)。选择中间的单箭头来将该列导入到列表中去。
 
在你选择完你想要使用的列,点击Next。你将会要求填写输出集。当你在填写这些输出集合的时候,你实际上就是在建立查询语句中的WHERE的功能。如果你只希望看到order ID等于三的结果,那么你就按照图G来进行配置。

当你填充好你希望的输出结果之后,点击Next,告知查询向导你所希望的结果存储方式。这个界面显示了你在每个下拉菜单中所选择的列。如果你选择了一列,那么结果就会按照你选择的每一列存放。

在向导的最后一个界面中,你可以接着在Microsoft Query中修改你的查询要求,Microsoft Query 允许你进一步制定你所接收到的结果,或者,你可以创建一个OLAP查询,或者将结果返回到Excel中去。在向导的这一部分中,我将添加一些查询,并且将结果用Microsoft Query和Excel的形式表现出来(如图H和图I)。

 
当你确实将数据结果返回到Excel中的时候,也许是通过向导,或者是通过Microsoft Query 。你都将被要求选择一个存放数据的空间。如果你打算包括报表的标题,那么你就可以适当的多留出一点空间,并且从大约第六行的开始存放数据。如果你选择在Microsoft Query 中查看查询信息并且进行进一步的修改,工具条上的图标显示为一个带有箭头的门,这个按钮是将数据返回到Excel中的一个功能键。

偶尔奏效的一种办法

当你使用一个更复杂的查询的时候,就如同我在上面举的这个例子,不是使用向导,而使用Query Analyzer (上文已经显示过)或者Microsoft Query来进行这个查询,就会变得简单得多。为了完成这个工作,在向导要求的时候就随便选择一列。接下来点击Next三次,并且选择在Microsoft Query 中查看数据或者修改查询。点击Finish,那么你就会看见你在Microsoft Query 中所选择的记录。在Microsoft Query窗口的最上端高亮化那个以图形显示的数据库表格。然后选择Table->Remove Table。点击工具栏上的SQL按钮,手动输入你的查询语句或者粘贴上最初的查询代码,点击OK按钮。

当准备这个报表的时候,向那些可能会提供一些信息的用户们了解一些情况。也许它开始是为了满足Phil的报表需要,但是,时间久了以后,通过少量的工作,就可以创建一个关于顾客个人的报表。