惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
爱范儿
爱范儿
WordPress大学
WordPress大学
博客园 - 三生石上(FineUI控件)
J
Java Code Geeks
Vercel News
Vercel News
aimingoo的专栏
aimingoo的专栏
T
Tailwind CSS Blog
罗磊的独立博客
B
Blog
博客园_首页
A
About on SuperTechFans
有赞技术团队
有赞技术团队
V
V2EX
U
Unit 42
I
InfoQ
IT之家
IT之家
博客园 - 司徒正美
阮一峰的网络日志
阮一峰的网络日志
博客园 - 叶小钗
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Stack Overflow Blog
Stack Overflow Blog
The Cloudflare Blog
H
Help Net Security

博客园 - anchky

招聘.Net或者Php工程师(可兼职) AMO添加维度属性、层次结构 求Tech·Ed 2007微软技术大会,上海站的票一张 在杭州的日子,每天数据挖掘 - anchky - 博客园 推荐Minesage的BI原创资源 OLAP项目的一般过程 Code For MiningStructure DataMining Digest 分解分析树,KPIs 用OWC展示多维数据集 MDX函数使用介绍(四):字符串函数&元组函数 MDX函数使用介绍(三):聚合函数 在AS2005的From子句中使用Select从句 MDX 函数的使用介绍(二):数值函数 文摘 MDX Solutions 通过http访问AS的server端配置(AS2000) MDX 函数的使用介绍(一) Some Digest From MDX Solution 推荐一个Blog“Microsoft SQL Server Development Customer Advisory Team”
在2005中使用DrillThrough函数
anchky · 2006-12-17 · via 博客园 - anchky

数据仓库、数据挖掘系统的显著优势之一是可以在分析的过程中对某个数据DrillThrough to detail。数据仓库较之普通数据库系统,对数据仓库的查询分析要比数据库快许多,这是因为数据仓库在ETL过程中已经对Integrating的数据源做了各种各样的预先统计处理,并增加了多倍的额外空间保存这些处理结果,才取得了对查询的快速反映优势。这也就是常说的“以空间换时间”。在OLAP分析的时候,也可以使用DrillThrough函数对数据源进行分析。


DrillThrough函数是MDX常用函数之一,跟通常MDX执行ExecuteCellSet并返回CellSet对象不同的是,使用了DrillThrough关键字的MDX只能ExecuteReader返回DataReader

1.        是否允许DrillThrough的权限设置集成在role的“管理角色”中。这点跟AS2000有比较大的区别。在AS2000中,仅对各个cube设置是否允许DrillThrough,所有role具有相同的是否允许DrillThrough的权限;在AS2005中设置更加明细,可以分别对各个role进行是否允许DrillThrough的设置。

2.        AS2000相同的是,DrillThough的对象依然是单个的cell。该cell可以是叶子水平的,也可以是基础度量的聚合cell。所以规定Select部分的每个on axis从句对应的member都是单一的。如:

DRILLTHROUGH

select

{[Measures].[Internet Sales Amount]} on Axis(0),

{[Date].[Calendar].[Month].&[2004]&[3]} on Axis(1),

{[Geography].[Geography].[Country].&[United States]} on Axis(2),

{[Product].[Product Categories].[Subcategory].[Mountain Bikes]} on

Axis(3)

FROM [Adventure Works]

或者select从句为空,在where从句指定。上句跟如下语句是等效的:

DrillThrough select  FROM [Adventure Works]

WHERE

(

[Measures].[Internet Sales Amount],

[Date].[Calendar].[Month].&[2004]&[3],

 [Geography].[Geography].[Country].&[United States]

,[Product].[Product Categories].[Subcategory].[Mountain Bikes]

))

3.        组成上述cell的各个维度都不允许有计算成员。没有做任何限制的维度默认都是defaultMember,如果该defaultMember含有计算成员,必须特别指定其他非计算成员。比如,度量维度的默认成员是计算成员,则必须在select或者where部分特别指定measures的成员([Measures].Members.Item(0)

4.        DrillThrough跟维度的类型没有关系。如果DrillThrough的是父子关系的层次结构的父成员,则返回的结果将是所有组成该cell的行,包括子成员。

5.        AS2005新增Return从句以限定返回的列。举个例子:

DrillThrough

select (

[Measures].[Internet Sales Amount],

[Date].[Calendar].[Month].&[2004]&[3],

[Geography].[Geography].[Country].&[United States] ,

[Product].[Product Categories].[Subcategory].[Mountain Bikes]

) on 0

from

[Adventure Works]

Return

[$Date].[Date],

KEY([$Product].[Style]),

[Internet Sales].[Internet Sales Amount],

[Internet Sales].[Internet Tax Amount]

6. 2000中,DrillThrough查询的是具体的数据库表,所以需要SqlConnection,而2005可以直接查询仓库系统,所以直接AdomdConnection

 public DataTable DrillThrough(string mdx,AdomdConnection adomdConn)
        
{
            DataTable schema 
= new DataTable();
            
try
            
{
                adomdConn.Open();
                
using (AdomdCommand command = new AdomdCommand(mdx, adomdConn))
                
{
                    
using (AdomdDataReader reader = command.ExecuteReader())
                    
{
                        
//output the column information
                        DataTable schema = reader.GetSchemaTable();
                        
foreach (DataRow row in schema.Rows)
                        
{
                            dt.Columns.Add(row[
0].ToString());
                        }

                       
                        
while (reader.Read())
                        
{
                            DataRow dr 
= dt.NewRow();
                            
for (int i = 0; i < reader.FieldCount; i++)
                            
{
                                dr[i] 
= reader[i];
                            }

                            dt.Rows.Add(dr);
                        }

                    }

                }

            }

            
finally
            
{
                adomdConn.Close();
            }

            
return dt;
        }