以编程方式生成 MDX 行数查询的最简单方法?
Easiest way to programmatically generate MDX rowcount query?
现在我正在处理一个可以生成 return SQL 或 MDX 查询(取决于查询的源数据库)的程序。我正在努力添加一个功能来计算给定查询 returned 的所有行。
现在,我有一些 SQL 的小背景,所以我能够解析 table 个名称并生成行数。然而,MDX 对我来说是一个全新的野兽。
在 SQL 中,我正在创建:
SELECT
COUNT(SUM)
AS ROWS
FROM
(
COUNT(*) AS COUNT FROM TABLE1
UNION ALL
COUNT(*) AS COUNT FROM TABLE2
UNION ALL
COUNT(*) AS COUNT FROM TABLE3
ETC...
)
现在,我想知道的是,我如何用 MDX 做类似的事情?我已经阅读了一些关于 MDX 的资料,从我收集到的内容来看,基本符号是
[Dimension].[Hierarchy].[Level]
现在使用 SQL,我从一个较大的生成查询中解析出 table 个名称,然后将它们简单地插入到一个新的以编程方式生成的查询中。我必须从更大的 MDX 查询中获取什么来生成我自己的行计数查询并将其发送到 运行?我正在处理的 MDX 的一个更简单的例子是:
WITH
MEMBER [BUSINESS1].[XQE_RS_CM1] AS '([BUSINESS1].[COMPANY_H].[all])', SOLVE_ORDER = 8
MEMBER [BUSINESS2].[XQE_RS_CM0] AS '([BUSINESS2].[all])', SOLVE_ORDER = 4
SELECT
NON EMPTY {[BUSINESS2].[ALL_TIME_H].[CALENDAR_YEAR_L].MEMBERS AS [XQE_SA1] , HEAD({[BUSINESS2].[XQE_RS_CM0]}, COUNT(HEAD([XQE_SA1]), INCLUDEEMPTY))} DIMENSION PROPERTIES PARENT_LEVEL, PARENT_UNIQUE_NAME ON AXIS(0),
NON EMPTY {[BUSINESS1].[COMPANY_H].[COMPANY_CD__L].MEMBERS AS [XQE_SA0] , HEAD({[BUSINESS1].[XQE_RS_CM1]}, COUNT(HEAD([XQE_SA0]), INCLUDEEMPTY))} DIMENSION PROPERTIES PARENT_LEVEL, PARENT_UNIQUE_NAME ON AXIS(1),
NON EMPTY {[Measures].[Measures].[BUSINESS3]} DIMENSION PROPERTIES PARENT_LEVEL, PARENT_UNIQUE_NAME ON AXIS(2)
FROM
[SOURCE] CELL PROPERTIES CELL_ORDINAL, FORMAT_STRING, VALUE
任何见解都会很棒,谢谢。
乍一看你的脚本看起来很合理,但在解开之后它变得有点(!)复杂。
此脚本与其他脚本的主要区别在于它对 axis(2) 的使用。在 sub-select 中经常使用额外的维度,但这有点奇怪,因为大多数客户端无法处理 3 维单元集 - 所以我对消费此信息的内容很感兴趣?
此外,成员 [BUSINESS1].[XQE_RS_CM1]
和 [BUSINESS2].[XQE_RS_CM0]
一样都是单个成员,那么 HEAD...
部分的意义何在?
WITH
MEMBER [BUSINESS1].[XQE_RS_CM1] AS
([BUSINESS1].[COMPANY_H].[all]), SOLVE_ORDER = 8
MEMBER [BUSINESS2].[XQE_RS_CM0] AS
([BUSINESS2].[all]), SOLVE_ORDER = 4
SELECT
NON EMPTY
{[BUSINESS2].[ALL_TIME_H].[CALENDAR_YEAR_L].MEMBERS AS [XQE_SA1]
,HEAD(
{[BUSINESS2].[XQE_RS_CM0]},
COUNT(
HEAD([XQE_SA1])
,INCLUDEEMPTY
)
)}
ON AXIS(0),
NON EMPTY
{[BUSINESS1].[COMPANY_H].[COMPANY_CD__L].MEMBERS AS [XQE_SA0]
,HEAD(
{[BUSINESS1].[XQE_RS_CM1]},
COUNT(
HEAD([XQE_SA0])
,INCLUDEEMPTY
)
)}
ON AXIS(1),
NON EMPTY
{
[Measures].[Measures].[BUSINESS3]
}
ON AXIS(2)
FROM
[SOURCE]
下面的return是否与原脚本的数据相同?
SELECT
NON EMPTY
{
[BUSINESS2].[ALL_TIME_H].[CALENDAR_YEAR_L].MEMBERS
,[BUSINESS2].[all]
}
ON 0,
NON EMPTY
{
[BUSINESS1].[COMPANY_H].[COMPANY_CD__L].MEMBERS
,[BUSINESS1].[COMPANY_H].[all]
}
ON 1
FROM [SOURCE]
WHERE [Measures].[Measures].[BUSINESS3];
然后您需要计算的是return在以下行集合中的成员数:
{
[BUSINESS1].[COMPANY_H].[COMPANY_CD__L].MEMBERS
,[BUSINESS1].[COMPANY_H].[all]
}
现在我正在处理一个可以生成 return SQL 或 MDX 查询(取决于查询的源数据库)的程序。我正在努力添加一个功能来计算给定查询 returned 的所有行。
现在,我有一些 SQL 的小背景,所以我能够解析 table 个名称并生成行数。然而,MDX 对我来说是一个全新的野兽。
在 SQL 中,我正在创建:
SELECT
COUNT(SUM)
AS ROWS
FROM
(
COUNT(*) AS COUNT FROM TABLE1
UNION ALL
COUNT(*) AS COUNT FROM TABLE2
UNION ALL
COUNT(*) AS COUNT FROM TABLE3
ETC...
)
现在,我想知道的是,我如何用 MDX 做类似的事情?我已经阅读了一些关于 MDX 的资料,从我收集到的内容来看,基本符号是
[Dimension].[Hierarchy].[Level]
现在使用 SQL,我从一个较大的生成查询中解析出 table 个名称,然后将它们简单地插入到一个新的以编程方式生成的查询中。我必须从更大的 MDX 查询中获取什么来生成我自己的行计数查询并将其发送到 运行?我正在处理的 MDX 的一个更简单的例子是:
WITH
MEMBER [BUSINESS1].[XQE_RS_CM1] AS '([BUSINESS1].[COMPANY_H].[all])', SOLVE_ORDER = 8
MEMBER [BUSINESS2].[XQE_RS_CM0] AS '([BUSINESS2].[all])', SOLVE_ORDER = 4
SELECT
NON EMPTY {[BUSINESS2].[ALL_TIME_H].[CALENDAR_YEAR_L].MEMBERS AS [XQE_SA1] , HEAD({[BUSINESS2].[XQE_RS_CM0]}, COUNT(HEAD([XQE_SA1]), INCLUDEEMPTY))} DIMENSION PROPERTIES PARENT_LEVEL, PARENT_UNIQUE_NAME ON AXIS(0),
NON EMPTY {[BUSINESS1].[COMPANY_H].[COMPANY_CD__L].MEMBERS AS [XQE_SA0] , HEAD({[BUSINESS1].[XQE_RS_CM1]}, COUNT(HEAD([XQE_SA0]), INCLUDEEMPTY))} DIMENSION PROPERTIES PARENT_LEVEL, PARENT_UNIQUE_NAME ON AXIS(1),
NON EMPTY {[Measures].[Measures].[BUSINESS3]} DIMENSION PROPERTIES PARENT_LEVEL, PARENT_UNIQUE_NAME ON AXIS(2)
FROM
[SOURCE] CELL PROPERTIES CELL_ORDINAL, FORMAT_STRING, VALUE
任何见解都会很棒,谢谢。
乍一看你的脚本看起来很合理,但在解开之后它变得有点(!)复杂。
此脚本与其他脚本的主要区别在于它对 axis(2) 的使用。在 sub-select 中经常使用额外的维度,但这有点奇怪,因为大多数客户端无法处理 3 维单元集 - 所以我对消费此信息的内容很感兴趣?
此外,成员 [BUSINESS1].[XQE_RS_CM1]
和 [BUSINESS2].[XQE_RS_CM0]
一样都是单个成员,那么 HEAD...
部分的意义何在?
WITH
MEMBER [BUSINESS1].[XQE_RS_CM1] AS
([BUSINESS1].[COMPANY_H].[all]), SOLVE_ORDER = 8
MEMBER [BUSINESS2].[XQE_RS_CM0] AS
([BUSINESS2].[all]), SOLVE_ORDER = 4
SELECT
NON EMPTY
{[BUSINESS2].[ALL_TIME_H].[CALENDAR_YEAR_L].MEMBERS AS [XQE_SA1]
,HEAD(
{[BUSINESS2].[XQE_RS_CM0]},
COUNT(
HEAD([XQE_SA1])
,INCLUDEEMPTY
)
)}
ON AXIS(0),
NON EMPTY
{[BUSINESS1].[COMPANY_H].[COMPANY_CD__L].MEMBERS AS [XQE_SA0]
,HEAD(
{[BUSINESS1].[XQE_RS_CM1]},
COUNT(
HEAD([XQE_SA0])
,INCLUDEEMPTY
)
)}
ON AXIS(1),
NON EMPTY
{
[Measures].[Measures].[BUSINESS3]
}
ON AXIS(2)
FROM
[SOURCE]
下面的return是否与原脚本的数据相同?
SELECT
NON EMPTY
{
[BUSINESS2].[ALL_TIME_H].[CALENDAR_YEAR_L].MEMBERS
,[BUSINESS2].[all]
}
ON 0,
NON EMPTY
{
[BUSINESS1].[COMPANY_H].[COMPANY_CD__L].MEMBERS
,[BUSINESS1].[COMPANY_H].[all]
}
ON 1
FROM [SOURCE]
WHERE [Measures].[Measures].[BUSINESS3];
然后您需要计算的是return在以下行集合中的成员数:
{
[BUSINESS1].[COMPANY_H].[COMPANY_CD__L].MEMBERS
,[BUSINESS1].[COMPANY_H].[all]
}