共享社区

首页 » 互联网资源共享社区 » 商业智能共享 » 一步一步学习sqlserver BI--应用开发(1)
mikecat - 2008-5-4 9:44:00
接着我们上次那篇《一步一步学习sqlserverBi--多维数据库建立》,现在我们多维数据库已经有了,并且里面也已经有了数据,那么赶快进入咱们程序员的主题吧。

今天我要在这个多维数据库上面开发两个应用:
1。按天统计各个部门的交易量
2。按天统计各个部门和各个游戏的交易量

首先设计强类型的数据集,如下图。
按部门统计数据集

按部门和游戏交叉统计数据集


设计MDX语句,在数据层执行MDX,并返回CellSet
/**//// <summary>
        /// 按天统计各个部门的交易数据
        /// </summary>
        /// <param name="tradeDateKey">日期的键值</param>
        /// <returns></returns>
        public CellSet Count(int tradeDateKey)
        {
            StringBuilder mdxBuilder = new StringBuilder();
            mdxBuilder.Append("WITH MEMBER [Measures].[Total Orders Count] AS 'SUM([Measures].[Total Orders] )' ");
            mdxBuilder.Append(" MEMBER [Measures].[Total Amount Count] AS 'SUM([Measures].[Total Amount])'");
            mdxBuilder.Append(" MEMBER [Measures].[Total Money Count] AS 'SUM([Measures].[Total Money])'");
            mdxBuilder.Append(" MEMBER [Measures].[Un Paid Cancel Amount Count] AS 'SUM([Measures].[Un Paid Cancel Amount])'");
            mdxBuilder.Append(" MEMBER [Measures].[Un Paid Cancel Money Count] AS 'SUM([Measures].[Un Paid Cancel Money])'");
            mdxBuilder.Append(" MEMBER [Measures].[Paid Cancel Amount Count] AS 'SUM([Measures].[Paid Cancel Amount])'");
            mdxBuilder.Append(" MEMBER [Measures].[Paid Cancel Money Count] AS'SUM([Measures].[Paid Cancel Money])'");
            mdxBuilder.Append(" SELECT  { [Measures].[Total Orders Count], [Measures].[Total Amount Count], [Measures].[Total Money Count], [Measures].[Un Paid Cancel Amount Count], [Measures].[Un Paid Cancel Money Count], [Measures].[Paid Cancel Amount Count], [Measures].[Paid Cancel Money Count]} ON COLUMNS,");
            mdxBuilder.Append(" {[Department].[Dep Code Alternate Key].Members} ON ROWS");
            mdxBuilder.Append(" FROM [Data Center DW]");
            mdxBuilder.Append(" WHERE ([Time].[TimeKey].["+tradeDateKey+"])");

            return DBServer.AnalysisServer.ExecuteCellset(mdxBuilder.ToString());
        }     


/**//// <summary>
        /// 按天统计各个游戏单个部门的交易数据
        /// </summary>
        /// <param name="tradeDateKey">日期的键值</param>
        /// <returns></returns>
        public CellSet Count(int tradeDateKey,int departmentKey)
        {
            StringBuilder mdxBuilder = new StringBuilder();
            mdxBuilder.Append("WITH MEMBER [Measures].[Total Orders Count] AS 'SUM([Measures].[Total Orders] )' ");
            mdxBuilder.Append(" MEMBER [Measures].[Total Amount Count] AS 'SUM([Measures].[Total Amount])'");
            mdxBuilder.Append(" MEMBER [Measures].[Total Money Count] AS 'SUM([Measures].[Total Money])'");
            mdxBuilder.Append(" MEMBER [Measures].[Un Paid Cancel Amount Count] AS 'SUM([Measures].[Un Paid Cancel Amount])'");
            mdxBuilder.Append(" MEMBER [Measures].[Un Paid Cancel Money Count] AS 'SUM([Measures].[Un Paid Cancel Money])'");
            mdxBuilder.Append(" MEMBER [Measures].[Paid Cancel Amount Count] AS 'SUM([Measures].[Paid Cancel Amount])'");
            mdxBuilder.Append(" MEMBER [Measures].[Paid Cancel Money Count] AS'SUM([Measures].[Paid Cancel Money])'");
            mdxBuilder.Append(" SELECT  { [Measures].[Total Orders Count], [Measures].[Total Amount Count], [Measures].[Total Money Count], [Measures].[Un Paid Cancel Amount Count], [Measures].[Un Paid Cancel Money Count], [Measures].[Paid Cancel Amount Count], [Measures].[Paid Cancel Money Count]} ON COLUMNS,");
            mdxBuilder.Append(" {[Game].[Game Code Alternate Key].Members} ON ROWS");
            mdxBuilder.Append(" FROM [Data Center DW]");
            mdxBuilder.Append(" WHERE ([Time].[TimeKey].[" + tradeDateKey + "],[Department].[Dim Department].["+departmentKey.ToString()+"])");

            return DBServer.AnalysisServer.ExecuteCellset(mdxBuilder.ToString());
        }     


在业务逻辑层把CellSet组装成我们前台需要的数据集格式
/**//// <summary>
        /// 填充按部门统计的数据
        /// </summary>
        /// <param name="model"></param>
        /// <param name="timeKey"></param>
        public void Fill(DepartmentTotalModel model, DateTime time, int timeKey)
        {
            CellSet cellSet = new DepartmentTotalDac().Count(timeKey);

            DepartmentTotalModel.FactGameTradeDataRow newRow;

            for (int i = 1; i < cellSet.Axes[1].Positions.Count; i++)
            {
                newRow = model.FactGameTradeData.NewFactGameTradeDataRow();
                newRow.Department = cellSet.Axes[1].Positions.Members[0].Caption;
                newRow.TradeDate = time;

                for (int j = 0; j < cellSet.Axes[0].Positions.Count; j++)
                {
                    if (cellSet.Axes[0].Positions[j].Members[0].Name == "[Measures].[Total Orders Count]")
                    {
                        newRow.TotalOrders = TypeParse.ToInt32(cellSet[j, i].FormattedValue);
                    }
                    else if (cellSet.Axes[0].Positions[j].Members[0].Name == "[Measures].[Total Amount Count]")
                    {
                        newRow.TotalAmount = TypeParse.ToInt32(cellSet[j, i].FormattedValue);
                    }
                    else if (cellSet.Axes[0].Positions[j].Members[0].Name == "[Measures].[Total Money Count]")
                    {
                        newRow.TotalMoney = TypeParse.ToDecimal(cellSet[j, i].FormattedValue);
                    }
                    else if (cellSet.Axes[0].Positions[j].Members[0].Name == "[Measures].[Un Paid Cancel Amount Count]")
                    {
                        newRow.UnPaidCancelAmount = TypeParse.ToInt32(cellSet[j, i].FormattedValue);
                    }
                    else if (cellSet.Axes[0].Positions[j].Members[0].Name == "[Measures].[Un Paid Cancel Money Count]")
                    {
                        newRow.UnPaidCancelMoney = TypeParse.ToDecimal(cellSet[j, i].FormattedValue);
                    }
                    else if (cellSet.Axes[0].Positions[j].Members[0].Name == "[Measures].[Paid Cancel Amount Count]")
                    {
                        newRow.PaidCancelAmount = TypeParse.ToInt32(cellSet[j, i].FormattedValue);
                    }
                    else if (cellSet.Axes[0].Positions[j].Members[0].Name == "[Measures].[Paid Cancel Money Count]")
                    {
                        newRow.PaidCancelMoney = TypeParse.ToDecimal(cellSet[j, i].FormattedValue);
                    }
                }

                model.FactGameTradeData.AddFactGameTradeDataRow(newRow);
            }

        }



/**//// <summary>
        /// 填充按游戏和部门交叉统计的数据
        /// </summary>
        /// <param name="model"></param>
        /// <param name="timeKey"></param>
        /// <param name="depKey"></param>
        public void Fill(GameByDepartmentTotalModel model,DateTime time,int timeKey,string dep,int depKey)
        {
            CellSet cellSet = new GameByDepartmentTotalDac().Count(timeKey, depKey);

            GameByDepartmentTotalModel.FactGameTradeDataRow newRow;

            for (int i = 1; i < cellSet.Axes[1].Positions.Count; i++)
            {
                newRow = model.FactGameTradeData.NewFactGameTradeDataRow();
                newRow.Game = cellSet.Axes[1].Positions.Members[0].Caption;
                newRow.Department = dep;
                newRow.TradeDate = time;             

                for (int j = 0; j < cellSet.Axes[0].Positions.Count; j++)
                {
                    if (cellSet.Axes[0].Positions[j].Members[0].Name == "[Measures].[Total Orders Count]")
                    {
                        newRow.TotalOrders = TypeParse.ToInt32(cellSet[j, i].FormattedValue);
                    }
                    else if (cellSet.Axes[0].Positions[j].Members[0].Name == "[Measures].[Total Amount Count]")
                    {
                        newRow.TotalAmount = TypeParse.ToInt32(cellSet[j, i].FormattedValue);
                    }
                    else if (cellSet.Axes[0].Positions[j].Members[0].Name == "[Measures].[Total Money Count]")
                    {
                        newRow.TotalMoney = TypeParse.ToDecimal(cellSet[j, i].FormattedValue);
                    }
                    else if (cellSet.Axes[0].Positions[j].Members[0].Name == "[Measures].[Un Paid Cancel Amount Count]")
                    {
                        newRow.UnPaidCancelAmount = TypeParse.ToInt32(cellSet[j, i].FormattedValue);
                    }
                    else if (cellSet.Axes[0].Positions[j].Members[0].Name == "[Measures].[Un Paid Cancel Money Count]")
                    {
                        newRow.UnPaidCancelMoney = TypeParse.ToDecimal(cellSet[j, i].FormattedValue);
                    }
                    else if (cellSet.Axes[0].Positions[j].Members[0].Name == "[Measures].[Paid Cancel Amount Count]")
                    {
                        newRow.PaidCancelAmount = TypeParse.ToInt32(cellSet[j, i].FormattedValue);
                    }
                    else if (cellSet.Axes[0].Positions[j].Members[0].Name == "[Measures].[Paid Cancel Money Count]")
                    {
                        newRow.PaidCancelMoney = TypeParse.ToDecimal(cellSet[j, i].FormattedValue);
                    }
                }

                model.FactGameTradeData.AddFactGameTradeDataRow(newRow);
            }

        }


好了,目前为止,我们已经从多维数据库里面返回我们需要统计的数据了,爱怎么展现就怎么展现吧。数据列表,柱状图,曲线图,饼状图等等。在以后的章节中我会介绍一款开源的非常成熟的图形控件ZedGraph,我做展现的时候,有部分就是用的这个家伙,修改了它的一些代码,感觉非常实用。

原文出处:http://www.cnblogs.com/lijun4017/
1
查看完整版本: 一步一步学习sqlserver BI--应用开发(1)