Datamart DSL
Contents
- 1 Copyright Notice
- 2 Introduction
- 2.1 MDX (MultiDimensional eXpressions)
- 2.1.1 Data types
- 2.1.2 Basic Syntax of MDX query
- 2.1.3 Examples
- 2.1.3.1 A typical query
- 2.1.3.2 .MEMBERS and .CHILDREN functions
- 2.1.3.3 Calculate Member
- 2.1.3.4 Slicer Dimension
- 2.1.3.5 Filter() function
- 2.1.3.6 Order() function
- 2.1.3.7 Lag() function
- 2.1.3.8 Lead() function
- 2.1.3.9 PrevMember function
- 2.1.3.10 NextMember function
- 2.1.3.11 FirstChild function
- 2.1.3.12 LastChild function
- 2.2 Jboss JBPM 5.4
- 2.1 MDX (MultiDimensional eXpressions)
- 3 Datamart DSL
Copyright Notice
All rights are reserved by Compex Systemhaus GmbH. In particular, duplications, translations, microfilming, saving and processing in electronic systems are protected by copyright. Use of this manual is only authorized with the permission of Compex Systemhaus GmbH. Infringements of the law shall be punished in accordance with civil and penal laws. We have taken utmost care in putting together texts and images. Nevertheless, the possibility of errors cannot be completely ruled out. The Figures and information in this manual are only given as approximations unless expressly indicated as binding. Amendments to the manual due to amendments to the standard software remain reserved. Please note that the latest amendments to the manual can be accessed through our helpdesk at any time. The contractually agreed regulations of the licensing and maintenance of the standard software shall apply with regard to liability for any errors in the documentation. Guarantees, particularly guarantees of quality or durability can only be assumed for the manual insofar as its quality or durability are expressly stipulated as guaranteed. If you would like to make a suggestion, the Compex Team would be very pleased to hear from you.
(c) 2016-2024 Compex Systemhaus GmbH
Introduction
MDX (MultiDimensional eXpressions)
MDX is a query language for OLAP databases, much like SQL is a query language for relational databases. It is also a calculation language, with syntax similar to spreadsheet formulas.
MDX has several elements that are used by, or influence, most statements:
- Identifiers - Identifiers are the names of objects such as cubes, dimensions, members, and measures, e.g.
[Time]
,[Measures]
. - Data Types - Define the types of data that are contained by cells, member properties, and cell properties. (details see Section #Data types )
- Expressions (MDX) - An expression is a combination of identifiers, values, and operators. You can use an expression as part of the data to be retrieved by a query or as a search condition to look for data that meets a set of criteria. Expressions include functions that return a single value, a set expression, e.g.
[Measures].[Discount Amount] * 1.5
. - Operators - Operators are syntax elements that work with one or more simple MDX expressions to make more complex MDX expressions, e,g,
+,-,*,/, <, >, AND, OR
etc. - Functions - Functions are syntax elements that take zero, one, or more input values, and return a scalar value or an object, e.g.
.Dimension
,.Level
,IsEmpty()
,Order()
,.CurrentMember
etc. - Comments - Comments are pieces of text that are inserted into MDX statements or scripts to explain the purpose of the statement. MDX supports
//
,--
and/* ... */
as commenting characters. - Reserved Keywords - Reserved keywords are words that are reserved for the use of MDX and should not be used for object names used in MDX statements, e.g.
SELECT
,WHERE
etc.
Data types
There are six primary data types in MDX:
Type | Description |
---|---|
scalar | Scalar is either a number or a string. It can be specified as a literal, e.g. number 5 or string "OLAP" or it can be returned by an MDX function, e.g. Aggregate() , .UniqueName , .Value etc.
|
Dimension / Hierarchy |
Dimension is a dimension of a cube. A dimension is a primary organizer of measure and attribute information in a cube. MDX does not know of, nor does it assume any, dependencies between dimensions- they are assumed to be mutually independent. A dimension will contain some members organized in some hierarchy or hierarchies containing levels. It can be specified by its unique name, e.g. [Time] or it can be returned by an MDX function, e.g. .Dimension . Hierarchy is a dimension hierarchy of a cube. It can be specified by its unique name, e.g. [Time].[Fiscal] or it can be returned by an MDX function, e.g. .Hierarchy . Hierarchies are contained within dimensions.
|
Level | Level is a level in a dimension hierarchy. It can be specified by its unique name, e.g. [Time].[Fiscal].[Month] or it can be returned by an MDX function, e.g. .Level .
|
Member | Member is a member in a dimension hierarchy. It can be specified by its unique name, e.g. [Time].[Fiscal].[Month].[August 2014] , by qualified name, e.g. [Time].[Calendar].[2014].[Q3].[August 2014] or returned by an MDX function, e.g. .PrevMember , .Parent , .FirstChild etc. Note that all members are specific to a hierarchy. If the self-same product is a member of two different hierarchies ( [Product].[ByManufacturer] and [Product].[ByCategory] ), there will be two different members visible that may need to be coordinated in sets and tuples.
|
Tuple | Tuple is an ordered collection of one or more members from different dimensions. Tuples can be specified by enumerating the members, e.g. ([Time].[Fiscal].[Month].[August] , [Measures].[Sales] ) or returned by an MDX function, e.g. .Item() .
|
Set | Set is an ordered collection of tuples with the same dimensionality, or hierarchality in the case of Microsoft's implementation. It can be specified enumerating the tuples, e.g. {([Measures].[Sales], [Time].[Fiscal].[2014]), ([Measures].[Sales], [Time].[Fiscal].[2014])} or returned by MDX function or operator, e.g. Crossjoin() , Filter() , Order() , Descendants() etc.
|
Other data types | Member properties are equivalent to attributes in the data warehouse sense. They can be retrieved by name in a query through an axis PROPERTIES clause of a query. The scalar data value of a member property for some member can be accessed in an expression through MDX, either by naming the property (e.g., [Product].CurrentMember.[Sales Price] ) or by using a special access function (e.g.,[Product].CurrentMember.Properties("Sales Price") ). In limited contexts, MDX allows other data types as well - for example Array can be used inside the SetToArray() function to specify an array that is not processed by MDX but passed to a user-defined function in an ActiveX library. Objects of other data types are represented as scalar strings indicating the object names, such as measure group name in Microsoft's MeasureGroupMeasures() function or KPI(Key Performance Indicator) name in for example Microsoft's KPIValue() or KPIGoal() functions.
|
Basic Syntax of MDX query
► Syntax:
-- One of the three ways to write comments
SELECT {set 0} on COLUMNS, /* block comment */
{set 1} on ROWS // line comment
...
{set n} on AXIS(n)
FROM [cube]
WHERE (tuple) // called "slicer dimension"
Note: Key differences between MDX and SQL
- “Cube in, Cube out” for MDX.
- set notation needs to be used after
SELECT
. FROM
clause can name only one cube- The
WHERE
clause describes the slicer axis (i.e., all the axes that is not a query axis) and is filtered by its default members
Examples
A typical query
► Example:
SELECT {[Time].[Calendar].[Year].[2013],
[Time].[Calendar].[Year].[2014]} ON COLUMNS,
{[Store].[Store Name].MEMBERS} ON ROWS
FROM [Sales]
WHERE ([Measures].[Store Sales])
.MEMBERS and .CHILDREN functions
► Syntax:
Hierarchy.Members
Level.Members
...
Member.Children
Notes:
-
.Members
returns the set of members in a dimension, level, or hierarchy. -
.Children
returns the set of children of a specified member.
► Example:
SELECT {[Time].[Calendar].[Year].[2014].CHILDREN} ON COLUMNS,
{[Store].[Store City].MEMBERS} ON ROWS
FROM [Sales]
WHERE ([Measures].[Store Sales])
Calculate Member
► Syntax:
WITH MEMBER parent1.name1 AS ’expression1’
MEMBER parent2.name2 AS ’expression2’
Notes:
- If a calculated member is only required for a single MDX query, you can define that calculated member by using the “WITH” keyword. A calculated member that is created by using the “WITH” keyword no longer exists after the query has finished running.
► Example 1:
WITH MEMBER [Time].[Calendar].[Year].[2014].[H1] AS
’[Time].[Calendar].[Year].[2014].[Q1] + [Time].[Calendar].[Year].[2014].[Q2]’
MEMBER [Time].[Calendar].[Year].[2014].[H2] AS
’[Time].[Calendar].[Year].[2014].[Q3] + [Time].[Calendar].[Year].[2014].[Q4]’
SELECT {[Time].[Calendar].[Year].[2014].[H1],
[Time].[Calendar].[Year].[2014].[H2]} ON COLUMNS
[Store].[Store Name].MEMBERS ON ROWS
FROM [Sales]
WHERE ([Measures].[Profit])
► Example 2: define and use new measures
WITH MEMBER [Measures].[ProfitPercent] AS
’([Measures].[Store Sales] – [Measures].[Store Cost]) / ([Measures].[Store Cost])’
SELECT [Time].[Calendar].[Year].[2014].CHILDREN ON COLUMNS,
[Store].[Store Name].MEMBERS ON ROWS
FROM [Sales]
WHERE ([Measures].[ProfitPercent])
Slicer Dimension
► Example: Slice on the [Product] dimension
SELECT {[Time].[Calendar].[Year].[2014].CHILDREN} ON COLUMNS,
{[Store].[Store City].MEMBERS} ON ROWS
FROM [Sales]
WHERE ([Product].[Product Family].[Drink],
[Measures].[Store Sales])
Filter() function
► Syntax:
FILTER(set, logical expression )
Notes:
- Returns the set that results from filtering a specified set based on a search condition.
► Example: If we are only interested in stores whose 2014 unit sales exceed 1000
SELECT {[Time].[Calendar].[Year].[2014].CHILDREN} ON COLUMNS,
FILTER( {[Store].[Store City].MEMBERS},
([Measures].[Unit Sales], [Time].[Calendar].[Year].[2014]) > 1000 ) ON ROWS
FROM [Sales]
WHERE ([Measures].[Store Sales])
Order() function
► Syntax:
ORDER(set, numeric/string expression, [, ASC | DESC | BASC | BDESC]
Notes:
- Arranges members of a specified set, optionally preserving or breaking the hierarchy.
► Example 1: List all measures for each city in decreasing order of their sales count
SELECT [Measures].MEMBERS ON COLUMNS,
ORDER(
[Store].[Store City].MEMBERS,
[Measures].[Sales Count],
BDESC
) ON ROWS
FROM [Sales]
► Example 2: If we are only interested in stores whose name is between “Berlin” and “Heidelberg”
SELECT [Measures].MEMBERS ON COLUMNS,
ORDER(
{[Store].[Store City].[Berlin]:[Heidelberg]},
[Store].CURRENTMEMBER.Name,
BASC
) ON ROWS
FROM [Sales]
Lag() function
► Syntax:
Member.LAG(index)
Notes:
- returns the member that is a specified number of positions before a specified member at the member's level.
-
.Lag(1)
is equivalent to the.PrevMember
function. -
.Lag(-1)
is equivalent to the.NextMember
function.
► Example: list all measures for December 2014
SELECT [Measures].MEMBERS ON COLUMNS,
[Time].[Fiscal].[Month].[February 2015].LAG(2) ON ROWS
FROM [Sales]
Lead() function
► Syntax:
Member.LEAD(index)
Notes:
- returns the member that is a specified number of positions following a specified member at the member's level.
-
.Lead(n)
is equivalent to.Lag(-n)
function.
► Example: list all measures for December 2014
SELECT [Measures].MEMBERS ON COLUMNS,
[Time].[Fiscal].[Month].[February 2015].LEAD(-2) ON ROWS
FROM [Sales]
PrevMember function
► Syntax:
Member.PREVMEMBER
Notes:
- the previous member in the level that contains a specified member.
► Example: list all measures for January 2014
SELECT [Measures].MEMBERS ON COLUMNS,
[Time].[Fiscal].[Month].[February 2015].PREVMEMBER ON ROWS
FROM [Sales]
NextMember function
► Syntax:
Member.NEXTMEMBER
Notes:
- Returns the next member in the level that contains a specified member.
► Example: list all measures for March 2015
SELECT [Measures].MEMBERS ON COLUMNS,
[Time].[Fiscal].[Month].[February 2015].NEXTMEMBER ON ROWS
FROM [Sales]
FirstChild function
► Syntax:
Member.FIRSTCHILD
Notes:
- Returns the first child of a specified member.
- Leaf members have no children and therefore no first child.
► Example: list all measures for first quarter of 2015, which is the first child of year 2015
SELECT [Measures].MEMBERS ON COLUMNS,
[Time].[Calendar].[Year].[2015].FIRSTCHILD ON ROWS
FROM [Sales]
LastChild function
► Syntax:
Member.LASTCHILD
Notes:
- Returns the last child of a specified member.
- Leaf members have no children and therefore no last child.
► Example: list all measures for march 2015, which is the last child of first quarter of year 2015
SELECT [Measures].MEMBERS ON COLUMNS,
[Time].[Calendar].[Quarter].[Q1 2015].LASTCHILD ON ROWS
FROM [Sales]