决策分析是一种为复杂的和结果不确定的决策问题提供的,旨在改善决策过程的合乎逻辑的系统的分析方法。决策分析的任务是对相关数据进行分析整理,并提供各种可能的分析结果,以供决策时参考。决策分析的方法和形式是多种多样的,本章主要介绍如何以图表、交叉表及透视图表等形象直观、易于理解的形式进行决策分析。
5.1 决策分析技术
图表是指将数据以图形的形式表示,通过它可以更加直观清楚地了解数据的大小及变化情况,方便对数据进行对比和分析。按照数据提供方式的不同又可分为静态图表和动态图表。交叉表是指将数据以行和列交叉的形式所组成的网格状的表格,通过它可以系统而有条理地对数据进行分析汇总。数据透视表是交互式报表,可以快速合并和比较大量数据。
通过不同的形式进行决策分析,需要以不同的技术来实现,下面将详细介绍每种决策分析方案中所采用的技术。
5.1.1 静态图表分析技术
静态图表是指不需要通过连接数据库提供数据,而绘制出的图表。静态图表主要通过TChart组件实现,通过该组件可以以图表的形式来对数据进行分析。该组件提供的图表类型包括折线图表(Line)、条型图表(Bar)、区域图表(Area)、点型图表(Point)、饼型图表(Pie)、甘特图表(Gantt)、箭型图表(Array)、泡沫图表(Bubble)、图形图表(Shape)等。下面对图表的常用样式进行具体介绍。
折线图表(Line)用于显示等时间间隔的变化趋势,主要强调时间性和变动率,折线图的分类轴通常表现为时间,例如年、季度、月份、日期等。如图5.1所示。

图5.1 折线图表
条型图表(Bar)用于显示各个项目之间的比较情况,它主要强调的是各个值之间的比较。条形图又可以转变成锥型图、柱型图、椭圆图、箭型图等。如图5.2所示。

图5.2 条型图表
区域图表(Area)用于表示不同数据系列之间的对比关系,强调随时间变化的幅度,同时也显示各数据系列与整体的比例关系。如图5.3所示。

图5.3 区域图表
饼型图表(Pie)用于表示各个数据之间的比例分配关系。饼型图表还可以制作成分离型饼图,它可以将一些重要的数据以饼型块的形式分离出来。如图5.4所示。

图5.4 饼型图表
点型图表(Point)用于显示单个或者多个数据系列的数据在某种间隔条件下的变化趋势。
1.图表类型的生成
在制作图表之前首先要添加图表类型,添加图表类型有两种方法,一种方法是通过双击TChart组件,在打开的对话框中单击“ADD”按钮,然后在打开的“TeeChart Gallery”对话框中选择相应的图表类型。此种方法适用于使用某种固定图表类型的情况。
当制作的图表种类繁多或个数不一时,可以通过TChart组件的AddSeries()方法来动态创建图表类型,该方法的语法格式如下:
procedure AddSeries(ASeries : TChartSeries);
参数ASeries表示一个图表组件,该方法可以动态加载的类型有:TLineSeries(拆线图)、TAreaSeries(区域图)、TPointSeries(点型图)、TPieSeries(圆饼图)、TBarSeries(条型图)、THorizBarBarSeries(水平条型图),在使用以上类型时,必需在单元中添加Series单元。下面用一个小例子来进行说明:
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, TeeProcs, TeEngine, Chart, Series;
..
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
myseries :TBarSeries;
begin
myseries := TBarSeries.Create(myseries); //创建一个图表类型
chart1.AddSeries(myseries);
myseries.AddArray([1,6,5,9,8,7,12,5,23]);
end;
动态创建图表也可以直接用图表类型来进行创建,主要是用图表类型的Create()方法来创建一个对象,再通过该对象的ParentChart属性来设置其父级窗体(Chart1),然后对图表进行控制,下面以条型图为例实现动态创建图表。
myseries := TBarSeries.Create(myseries);
myseries.ParentChart:=chart1;
myseries.AddArray([1,6,5,9,8,7,12,5,23]);
2.在图表中添加数据
在添加完图表类型后,需要在图表上添加数据信息,添加数据信息的方法有很多,通过AddArray()、AddXY()、Add()方法都可以实现。
l AddArray()方法
在图表中批量添加数据信息,其语法如下:
Function AddArray(const Values:Array of Double):Integer;
参数Values是一个双精度型的数组,用于记录所有数据的值。
l AddXY()方法
在图表中X轴和Y轴上的指定位置添加数据信息。语法如下:
Function AddXY(const AXValue : Double;Const AYValue : Doule;const Alabel : String;
Acolor : TColor):Integer;
参数AXValue表示在图表中添加数据的X轴位置,参数AYValue表示添加数据的高度,也就是数据量,参数Alabel表示添加数据的名称,参数TColor表示在图表中添加数据块的颜色。通过该方法可以在图表的X轴上的任意位置添加数据,其应用如下:
Chart1.Series[0].AddXY(1,10,'addxy',cllime); //可以按X轴的任意位置进行添加
Chart1.Series[0].AddXY(0,0,'addxy',cllime);
Chart1.Series[0].AddXY(2,30,'addxy',cllime);
Chart1.Series[0].AddXY(3,50,'addxy',cllime);
l Add()方法
按照指定的顺序将数据添加到图表中。语法如下:
Function Add(const Avalue : Double;const Alabel : Srting;AColor : TColor):Integer;
参数Avalue表示要添加数据的数量,参数Alabel表示要添加数量的名称,参数AColor表示添加数据块的颜色。该方法是以添加的顺序在图表中进行显示,与AddXY()方法不同,当添加的顺序改变时,图表中数据的顺序也会改变。其应用如下:
Chart1.Series[0].Add(30,'打印机',clTeeColor);
Chart1.Series[0].Add(10,'主板',clTeeColor);
Chart1.Series[0].Add(20,'扫描仪',clTeeColor);
Chart1.Series[0].Add(50,'显示器',clTeeColor);
Chart1.Series[0].Add(30,'CPU',clTeeColor);
3.图表背景效果的设置
添加完数据以后,就可以制作出一个最基本的图表,为了使图表更加美观,可以为图表设置背景颜色。通过Color属性可以设置图表的背景颜色,通过Gradient属性还可以设置图表背景颜色的渐变效果,该属性中包含了Visible、EndColor、StartColor属性,当Visible属性为True时,才可以利用EndColor、StartColor和Direction属性对背景颜色进行渐变设置。在用Direction属性设置表格背景的渐变效果时,应在单元中添加TeCanvas单元,其渐变效果的样式有:gdbottomtop(从下向上渐变)、gdtopbottom(从上向下渐变)、gdRightLeft(从右向左渐变)、gdLeftRight(从左向右渐变)、gdfromcenter(从中间向四边渐变)、gdfromtopleft(左上角渐变)、gdfrombottomleft(左下角渐变)。下面用一个小例子来实现如何对图表背景进行渐变效果。
Chart1.Gradient.Visible := True;
Chart1.Gradient.EndColor := clLime;
Chart1.Gradient.StartColor := clWhite;
Chart1.Gradient.Direction := gdRightLeft;
4.图表矩形区域的高亮度显示
在图表中显示数据信息后,通过X轴和Y轴会形成一个矩形区域,数据将显示在该区域内。通过对矩形区域的高亮度显示,可以使图表具有另一种风格。有三种方法可以实现:
一是用BackColor属性对图表的矩形区域进行填充颜色;
二是用Canvas属性下的Frame3D()方法在指定的矩形区域中画框。
Frame3D()方法的语法格式如下:
Procedure Frame3D(Rect : Trect;TopColor : TColor;BottomColor : TColor;Width : Integer);
参数Rect表示矩形区域;参数TopColor表示左边框和上边框的颜色;参数BottomColor表示右边框和下边框的颜色;参数Width表示边框的宽度。下面用一个小例子来实现在矩形区域中画边框。
With Chart1,Canvas do
begin
Brush.Style:=bsClear;
Pen.Color:=clRed;
Frame3D(ChartRect,clRed,clBlue,2);
end;
其中TChart组件的ChartRect属性用于确定图表中坐标轴所组成的矩形区域。
三是用Frame属性设置图表框架(线条)。
Frame属性包含Color、Style、Width属性,它们分别表示框架的颜色、风格及宽度。下面用一个小例子对图表的框架进行设置。
procedure TForm1.FormCreate(Sender: TObject);
begin
Chart1.Frame.Color := clBlue;
Chart1.Frame.Style := psSolid;
Chart1.Frame.Width := 2;
end;
当然,为了能够更好的区分图表中的各个数据,可以将每个数据的数据块以不同的颜色进行显示。除饼型图表外,其他的图表在生成以后,其数据块的默认颜色为红色,可以通过ColorEachPoint属性的设置来改变数据块的颜色,当该属性为False时,数据块的颜色为默认颜色,否则,将根据该组件所分配的默认随机颜色来设置各数据块的颜色。
5.在图表中添加标题或文本
在制作图表后,为了能够使观察者清楚图表的用处,可以在图表中添加标题或文本,对其进行说明。可以利用LeftAxis、RightAxis、TopAxis、BottomAxis属性分别在图表的左侧、右侧、上方和下方添加标题。下面以LeftAxis属性为例,在图表的左侧添加一个标签。
Chart1.LeftAxis.Title.Caption := '2005年产品销售图表';
Chart1.LeftAxis.Title.Font.Size := 8;
Chart1.LeftAxis.Title.Font.Color := clBlue;
Foot属性用于设置图表底部的文本和格式。在该属性中还包含了Text、Alignment、Font等属性,分别用于获取显示的说明文字,文字的显示样式及其文字的字体设置等。下面以一个小例子来进行说明。
with Chart1.Foot do
begin
Text.Add('图表的说明性文字');
Alignment := taCenter;
Font.Size := 8;
Font.Color := clRed;
end;
在图表上进行文字说明,也可以用绘图的形式在图表上绘制文字,主要通过Canvas属性的TextOut()方法在图表上进行绘制。该方法的语法格式如下:
Procedure (x : Integer;y : Integer;const Text : String);
参数x、y表示文字显示的起始坐标;参数Text表示要显示的文字。下面用该方法在TChart组件上进行绘制。
Chart1.Canvas.Brush.Style := bsclear;
Chart1.Canvas.TextOut(0,0,'2005年产品销售图表');
在用TextOut()方法进行绘制时,文字的背景颜色将覆盖TChart组件,那么,如何清空文字的背景颜色呢,这就需要将Canvas属性的Brush的Style属性设为bsclear,这时,文字的背景颜色将处于透明状态,如以上代码所示。
为了能使绘制的文字在图表显示时就直接绘制在图表上,需要将以上代码写在OnAfterDraw事件中,该事件在图表绘制后触发。在利用画布绘制图表时,需要在该事件中编写绘制代码,这样,在图表重绘时,会自动调用OnAfterDraw事件,不需要用户自己截获Windows消息。
如果想在图表上显示自定义图片,可以将以下代码写入OnAfterDraw事件中。这样,在图表显示时,就可以将图片绘制在图表中。
Chart1.Canvas.Draw(0,(Chart1.ChartHeight)div 2,Image1.Picture.Bitmap);
6.图表的旋转及显示方式
在显示图表时,有时需要将图表进行动态的旋转,这样可以使图表以不同的角度进行显示,View3DOptions属性可以控制图表的旋转(Rotation属性用于水平旋转,Elevation属性用于垂直旋转)、移动(HorizOffset属性用于水平移动,VertOffset属性用于垂直移动)、缩放(zoom属性)等操作。
通过View3DWalls属性可以设置图表的3D显示效果,当属性值为True时,将以3D效果显示图表。当属性值为False时,将取消3D效果显示。
当图表以3D效果显示时,可以用Chart3DPercent属性设置图表尺寸和图表深度的显示比例,取值在1~100之间。在设置该属性时,不需要将图表设为3D效果,但以3D效果显示,效果更加明显。
7.对图表的轴和网格进行设置
在对图表进行操作时,有时需要对图表中的网格或坐标轴进行控制。
当数据太大时,Y轴的刻度值不能完全显示出来,这样,在观察数据时,有时不能准确的知道数据与数据间的差距,这时,可以将LeftAxis属性的Axis的Visible属性设为False,将Y轴的刻度进行细分。
在观察图表时,可以将LeftAxis的Labels属性设为False,将Y轴的刻度去掉,只显示X轴的数据,也可以对LeftAxis的LabelStyle属性进行设置,来改变Y轴的显示形式,LabelStyle属性的取值如表5.1所示。
表5.1 Chart1ClickSeries事件的参数说明
|
参数 |
描述 |
|
talAuto |
自动显示Y轴的样式 |
|
talNone |
不显示Y轴的刻度 |
|
talValue |
以数值型显示Y轴的刻度 |
|
talMark |
以SeriesMarks样式在Y轴上显示标签 |
|
talText |
以XLabels字符串型在Y轴上显示标签 |
8.对图表数据的相关操作
当图表中的数据太多时,可以将图表进行分页显示,那么,如何对图表进行分页呢?怎样才能对分页的图表进行翻页呢?并在翻页的同时,显示其页数?解决以上问题其实很简单,在图表重绘前,可以用MaxPointsPerPage属性来实现图表的分页,将该MaxPointsPerPage属性设置为指定的数字,每页将按设定的个数进行显示;将Page属性进行加1或减1,可以实现图表的翻页,也可以用NextPage或PreviousPage属性来实现;OnPageChange事件是在图表的当前页发生改变时触发,可以通过该事件来显示图表的当前页。
如果用户在对图表进行翻页时,不想用按钮进行控制,可以通过OnClickBackground事件在图表上以鼠标单击或右击的形式,来使图表进行上下翻页。该事件的语法格式如下:
procedure OnClickBackground(Sender: TCustomChart; Button: TMouseButton; Shift:
TShiftState; X, Y: Integer);
该事件在用户单击或右击坐标轴、图表及图例时触发。参数Sender表示触发事件的对象,Button表示触发事件时单击的鼠标按钮,Shift表示功能键,X、Y表示鼠标点的坐标。下面用一个小例子来实现图表的翻页。
procedure TForm1.Chart1ClickBackground(Sender: TCustomChart;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
Chart1.NextPage
else if Button = mbRight then
Chart1.PreviousPage;
end;
有时用户在对数据表中的数据进行观察的时候,因数据太多,无法准确的找到要观察的数据,TChart组件本身有一个OnClickSeries事件,该事件在用户单击图表数据时触发。用户可以利用该事件在单击数据时,改变其颜色,这样就可以快速的找到要查询的数据,也可以用该方法将有一定联系的数据块设成同一种颜色。该事件的语法格式如下:
procedure TForm1.Chart1ClickSeries(Sender: TCustomChart;
Series: TChartSeries; ValueIndex: Integer; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
OnClickSeries事件的参数说明,如表5.2所示。
表5.2 OnClickSeries事件的参数说明
|
参数 |
描述 |
|
Sender |
表示触发事件的TChart组件 |
|
Series |
表示用户单击的图表对象 |
|
ValueIndex |
表示图表数据块的索引值 |
|
Button |
表示触发事件时单击的鼠标按钮 |
|
Shift |
表示功能键 |
|
X、Y |
表示鼠标点的坐标点 |
可以在该事件中添加以下语句,在图表的数据块上单击鼠标时,将改变数据块的颜色。
Series.ValueColor[ValueIndex]:= clLime;
5.1.2 动态图表分析技术
动态图表是指图表中的数据通过连接数据库提供的图表,动态图表主要通过TDBChart组件实现,它可以直接与数据库相连接,动态的获取数据库中的信息。TDBChart组件中的属性、方法、事件及其图表类型与TChart组件相同,唯一不同的就是多了一些可以对数据库进行操作的属性、方法和事件。下面只对与数据库相关的知识进行讲解,其他的基础知识可以参考5.1.1节中的内容。
1.动态图表的连接方式
用TDBChart组件连接数据库一共有两种方法:一种是用手工方式来连接数据库;另一种方法是利用该组件的属性在程序运行时,动态的连接数据库。
手工方式连接数据库就是在设计时期,双击该组件,在弹出的对话框中添加一个图表类型,之后在Series选项卡的Data Source选项卡中的下拉列表框中的选择“Dataset”,在弹出的Dataset下拉列表中选择一个连接数据库的组件,如ADO组件ADOQuery1,该组件在连接前必需与数据库相连接,在Labels、X和Bar下拉列表中选择相应的字段,这时,TDBChart组件将显示所连接数据表的相关信息。
在程序运行时连接数据库是通过TDBChart组件的DataSet、XLabelsSource、XValues和YValues属性来实现的。
DataSet属性用于连接数据库组件,与Data Source选项卡中的下拉列表框“Dataset”的功能是一样的。XLabelsSource属性是以数据表中的某一字段,做为图表的显示的标志,该属性是必选值。XValues和YValues属性是用来设置X轴和Y轴的显示刻度,这两个属性只能获取整型,货币型,单精度型,双精度型的字段。下面以一个小例子来实现图表与数据库的连接。
procedure TForm1.FormCreate(Sender: TObject);
begin
DBChart1.Series[0].DataSource := ADOQuery1;
DBChart1.Series[0].XLabelsSource := 'TradeName';
DBChart1.Series[0].XValues.ValueSource := 'TradeSum';
DBChart1.Series[0].YValues.ValueSource := 'TradeMoney';
end;
2.动态图表的更新
在用TDBChart组件动态连接数据库时,有时用户需要及时对图表进行更新,有时需要手动对图表进行更新,这时就需要用AutoRefresh属性进行控制,当该属性的值为True时,图表的数据将根据数据集的改变而实时更新,否则,数据集的改变将不会立即反映在图表上。
当数据更新过于频繁时,用户又不想对数据进行实时更新,那么就应该用RefreshInterval属性将数据以指定的时间段进行刷新,该属性以秒为单位,默认值为0,表示不进行刷新,当该属性大于0时,在TDBChart组件的内部就好像安装了一个TTimer组件,每隔一段时间,就会刷新数据集中的所有记录。
对数据进行刷新也可以用CheckDataSource方法来实现,使用该方法可以刷新图表中的所有点,这些点来自于数据表、查询或其他的图表。如果在图表中添加或修改数据,规则的调用CheckDataSource方法可以实时地显示数据。该方法的使用如以下代码所示:
DBChart1.CheckDatasource(DBChart1.Series[0]);
在开发数据库程序时,如果当前数据集信息没有及时反映到图表中,可以调用RefreshData方法对图表进行强制刷新。
在设计程序时,如果只需要刷新当前图表,而不必刷新TDBChart组件中所有的图表,可以调用RefreshDataSet方法,语法如下:
procedure RefreshDataSet(ADataSet: TDataSet; ASeries: TChartSeries);
该方法用于从参数ADataSet所标识的数据集中取得所有的记录,将其添加到参数ASeries所标识的图表中。该方法只对当前激活的图表(ASeries.Active为True)起作用。应用代码如下:
DBChart1.RefreshDataSet(ADOQuery1,DBChart1.Series[0]);
在用图表连接数据源时,因为某种原因无法连接数据库,使程序发生错误,那么如何避免数据源的连接错误呢?这就需要用IsValidDataSource方法来判断数据源是否合法,语法如下:
function IsValidDataSource(ASeries: TChartSeries; AComponent: TComponent):
Boolean; virtual;
该方法确定参数AComponent是否是合法的数据源,并用于为ASeries组件提供数据。TDBChart组件接受TChartSeries组件和TDataSet(TTable、TQuery、TClientDataset等)作为合法的数据源。
3.对动态图表数据进行过滤
在设计程序时,如果需要在图表加载数据时进行一些额外的处理,可以在OnProcessRecord事件中编定相应的处理过程。其语法如下:
procedure TForm1.DBChart1ProcessRecord(Sender: TCustomDBChart;
DataSet: TDataSet);
该事件在图表从数据库中加载每条记录时触发。参数Sender表示触发OnProcessRecord事件的对象,DataSet表示加载数据的数据集,可以在该事件中过滤一些不必要的数据。
5.1.3 交叉表分析技术
交叉表对象是一个网格,用来根据指定的条件返回值,将数据显示在压缩行和列中,这种格式易于比较数据并辨别其趋势。它由三个元素组成:行、列、摘要字段。交叉表也可以看作是某一数据表的查询表,用于显示表中某个字段的总结值(合计、个数以及平均值等),并将它们分组放置在查询表中,一组列在数据表的左侧,一组列在数据表的上部。
交叉表的特点是:
(1)数据在横、纵两个方向扩展,即行、列均不固定。
(2)左侧和上方都有一个表头,而中间是明细区,后面往往还有合计之类的计算。
交叉表分为静态交叉表和动态交叉表,静态交叉表是根据指定的表生成的;动态交叉表可以根据不同的表(必需符合生成交叉表的条件)生成相应的交叉表。
1.静态交叉表
静态交叉表是根据指定的表生成交叉表,它不能随机的改变交叉表的列数及名称,其列的相关信息是人工录入的。下面利用MR_Distribution数据库中的tb_Crosstab数据表来生成静态交叉表。tb_Crosstab数据表如图5.5所示。

图5.5 tb_Crosstab数据表
在tb_Crosstab数据表中可以看出,在DYear字段中为年份的重复记录,在Plant字段中记录了各年份的车间名称,而在Oput字段中则记录了某年某车间的生产数量,可以用DYear字段的非重复信息来作为交叉表的主键列,用Plant字段的非重复信息来作为交叉表的列标题名称,用Oput字段的信息在交叉表中添写值。下面用SQL语句来实现交叉表的操作,相关代码如下:
SELECT B.*, (B.一车间 + B.二车间 + B.三车间 + B.四车间) AS 汇总
FROM (SELECT DYear,
SUM(CASE A.Plant WHEN '一车间' THEN A.Oput ELSE 0 END) AS [一车间],
SUM(CASE A.Plant WHEN '二车间' THEN A.Oput ELSE 0 END) AS [二车间],
SUM(CASE A.Plant WHEN '三车间' THEN A.Oput ELSE 0 END) AS [三车间],
SUM(CASE A.Plant WHEN '四车间' THEN A.Oput ELSE 0 END) AS [四车间]
FROM tb_Crosstab AS A
GROUP BY A.DYear) AS B
交叉表的生成结果如图5.6所示。

图5.6 根据tb_Crosstab数据表生成的交叉表
2.动态交叉表
动态交叉表是根据原数据表以及交叉表的三元素:行、列、摘要字段,将指定的表生成交叉表。动态交叉表技术需要通过存储过程来实现,可以利用游标制作存储过程。
用游标制作动态交叉表存储过程的步骤如下:
(1)通过检索指定的列信息定义一个游标,即tb_Crosstab数据表中的Plant列;
(2)遍历游标,用游标里的值替换在实现静态交叉表中的CASE语句中的判断内容,生成新的SQL语句;
(3)执行新生成的SQL语句,并返回执行结果。
创建实现图5.6所示交叉表存储过程Pro_DynamicAcross的完整代码如下:
CREATE procedure Pro_DynamicAcross
@TableName as varchar(50), --生成交叉表依据的表名
@GroupColumn as varchar(50), --分组依据的字段名
@NewColumn as varchar(50), --生成表头依据的字段名
@StatColumn as varchar(50), --欲统计的字段名
@Operator as varchar(10) --统计的运算方式
AS
DECLARE @SQL as varchar(8000), @Column as varchar(50) --定义参数
SET NOCOUNT ON
EXECUTE ('DECLARE Cursor_Crosstab CURSOR FOR SELECT DISTINCT '+@NewColumn+'
from '+@TableName) --声明游标
begin
OPEN Cursor_Crosstab --打开游标
SET @SQL='select '+@GroupColumn+' as ['+@GroupColumn+']' --定义SQL语句头
while (0=0)
BEGIN --遍历游标
FETCH NEXT FROM Cursor_Crosstab INTO @Column --通过游标获取列标题名称
if (@@fetch_status<>0) break
SET @SQL=@SQL+', '+@Operator+ '(CASE '+@NewColumn+' WHEN '''+@Column+''' THEN '
+@StatColumn+' ELSE Null END) AS ['+@Column+']' --循环追加SQL语句
END
SET @SQL=@SQL+', '+@Operator+'(' + @StatColumn+') AS ['+@Operator+
'('+@StatColumn+')]'
SET @SQL=@SQL+' from '+@TableName+' group by '+@GroupColumn --定义SQL语句尾
EXECUTE(@SQL) --执行SQL语句
IF @@error<>0 RETURN @@error --如果出错,则返回错误代码
CLOSE Cursor_Crosstab --关闭游标
DEALLOCATE Cursor_Crosstab
RETURN 0 --释放游标,释放成功则返回0
end
GO
在SQL Server查询分析器上执行下面的代码,就可以得到如图5.6所示的交叉表。
Pro_DynamicAcross 'tb_Crosstab', 'DYear', 'Plant', 'Oput', 'SUM'
在SQL Server查询分析器上调用存储过程时,最前面的为欲调用的存储过程的名称,后面跟随的是执行存储过程所需要的参数,参数用引号括起,存储过程名称与参数之间用空格分隔,参数之间用逗号分隔。
说明:这是一个通用的存储过程,只要正确的传入生成交叉表依据的表名(@TableName),生成主键列依据的字段名(@GroupColumn),生成表头依据的字段名(@NewColumn),欲统计的字段名(@StatColumn),统计的运算方式(@Operator),就可以成功的生成所需要的交叉表。
5.1.4 透视图表分析技术
1.透视表
所谓透视表,实际上就是一个三维数据表格(Multi-dimension table),让数据沿三个不同的坐标轴排列,当试图研究不同数据之间的关系时,透视表使用起来非常方便,通过它可以从不同角度对数据进行分析,从而为决策者提供浓缩信息作为参考。
熟练运用Excel的都知道它的透视表功能,通过该功能,可以完成对数据的筛选、排序和分类汇总等工作。下面以Excel的透视表为例对其进行简单的说明。
在Excel中,根据如图5.7所示的数据表所生成的透视表,如图5.8所示。

图5.7 Excel中的数据表

图5.8 Excel中的透视表效果
从图5.8可以看出,透视表共包含5个部分:
(1)页字段:用来设置透视表当前页显示的数据范围;
(2)行字段:用来设置透视表显示的数据行;
(3)列字段:用来设置透视表显示的数据列;
(4)数据字段:用来设置透视表中用于统计的数据;
(5)下拉式字段选择数据:用来控制透视表当前页显示的数据范围、行范围与列范围。
前4个部分已经能够制作一个完整的透视表,第5部分用于将已完成的透视表进行数据的设置,可以通过所设置的页字段、行字段、列字段、数据字段中的数据设置透视表的显示范围。
当单击与行字段对应的下拉式字段时,将行字段中的数据以非重复的形式显示在一个对话框中,在对话框中选择相应的数据,可以对透视表的显示范围进行设置。如图5.9所示。

图5.9 设置行字段的数据
其他字段的数据设置与行字段的数据设置类似,在这里不做过多的说明。
2.透视图
透视图的功能与透视表的功能相同,同样是用来对统计的数据进行动态分析,透视图的优点是用户可以更直观的了解数据的统计结果,图5.10为在Excel中实现的透视图效果。

图5.10 Excel透视图






