MDX Essentials: Basic Set Functions: The TopCount() Function, Part II - Page 5June 6, 2005 The calculated member we create with this MDX is a "busy place." It accomplishes the TopCount(), providing as the << Set >> argument a Descendants() function. We saw the TopCount() / Descendants combination in very similar action in the first exercise of the series, and so I won't go into that any further here, other than to point out that the function is structured to return the set of the members of the Warehouse dimension that belong to the level it specifies, the Warehouse Name level. It is from this level that we are able to obtain the string representing the Warehouse Name. The TopCount() function is provided a << Count >> argument of "1" , obviously, as we seek to return the top Warehouse with regard to the Units Shipped measure, the final argument of the function, << Numeric Expression >>. The interim result of the TopCount() function, therefore, is to return a single-member for each month, which enables us to leverage the .Item function. .Item, in turn allows us to exploit its capability to return the member in a tuple, based upon its position. By using .Item(0), we select the first single-member (the product of the TopCount() of 1) tuple in each Month set. (.Item contains a zero-based specification of position, hence the zero as the position argument.) We then use .Item(0) again, immediately after the first .Item function, to select the first (and only) member in the single-member tuple. Finally, we use the .Name function to return the name of the member that we have so precisely isolated. This function, combined with the functions just described, result in a calculated member that returns the name of the Warehouse with the highest shipping quantity in a given Month in 1998, which is handily identified by the TopCount() / Descendants() combination we discussed earlier. NOTE: For an introduction to the .Item function, see my article Basic Member Functions: The .Item Function, another member of the MDX Essentials series at Database Journal. 9. Modify the ON COLUMNS line of the query, which already contains the Units Shipped measure, to contain the new Largest Shipper calculated member / measure we defined above, as follows:
{[Measures].[Units Shipped], [Measures].[Largest Shipper]} ON COLUMNS,
10. Leave the remainder of the query in its original state. The Query pane appears as depicted in Illustration 8, with our modifications marked.
11. Execute the query by clicking the Run Query button in the toolbar. The Results pane is populated, and the resulting dataset, partially shown in Illustration 9, appears.
We note that the Warehouse Names of the locations with the highest shipping volumes appear. The presence of the months of 1998, which populate the rows already, result in the evaluation of the Largest Shipper calculated measure for each month respectively, giving us an outcome that meets the expressed requirements of the information consumers. 12. Re-save the file as MDX032-2-2. 13. Leave the query open for the next step. Using the results from our latest query execution, we can easily verify that the calculated member is producing the results that its name purports. An example of such verification appears in Illustration 10, where we see that the top shipper Warehouse Name returned by our calculated member reflects the name of the Warehouse that displays the highest value in the monthly Units Shipped measure at its left.
All that remains, to align the results dataset with the presentation requirements specified by the information consumers, is to remove the Units Shipped measure. Recall that we added this measure earlier simply to allow us to verify the correct operation of the Largest Shipper calculated member. 14. Within the query we have saved as MDX032-2-2, replace the top comment line of the query with the following: -- MDX032-2-3, Alignment of Results Dataset to the Business Requirements 15. Save the query as MDX032-2-3, to keep MDX032-2-2 intact as a working sample. 16. Remove the Units Shipped measure ([Measures].[Units Shipped]), from the existing ON ROWS line within the SELECT statement of the query, so that the line appears simply as: { [Measures].[Largest Shipper]} ON COLUMNS,
17. Remove NONEMPTYCROSSJOIN, and the left parenthesis to its right, on the line below the row we modified in the last step (part of the ON ROWS specification). The item to be removed appears as: NONEMPTYCROSSJOIN( 18. Remove the following, the second Descendants() function, from the ON ROWS definition, as well: {DESCENDANTS(
[Warehouse].[All Warehouses].[USA], [Warehouse].
[Warehouse Name] )})
19. Remove the comma (",") that appears to the right of this remaining portion of the ON ROWS line: [Time].[1998], [Time].[Month] )}, To summarize the final set of modifications, the query appears, before our modifications, as follows, with syntax to be deleted enclosed in rectangles: -- MDX032-2, Addition of Calculated Member to Produce Name of Warehouse with
Highest 1998 Volume Monthly Shipping
WITH
MEMBER
[Measures].[Largest Shipper]
AS
'TOPCOUNT( DESCENDANTS(
[Warehouse].[All Warehouses].[USA], [Warehouse].[Warehouse Name] ),
1, (Time.CURRENTMEMBER, [Measures].[Units Shipped])
).ITEM(0).ITEM(0).NAME'
SELECT
{ [Measures].[Units Shipped], [Measures].[Largest Shipper]} ON COLUMNS,
NONEMPTYCROSSJOIN(
20. Leave the remainder of the query in its original state. The Query pane appears as depicted in Illustration 11, with deletions having been made.
21. Execute the query by clicking the Run Query button in the toolbar. The Results pane is populated, and the dataset shown in Illustration 12 appears.
22. Re-save the file as MDX032-2-3. 23. Exit the MDX Sample Application when ready. Summary ...This article served as an extension of our previous introductory article, Basic Set Functions: The TopCount() Function, Part I. We briefly reviewed the operation of the TopCount() function, and then extended our examination of the TopCount() function to include somewhat more sophisticated uses. We defined illustrative business needs as posed to us by hypothetical groups of information consumers, and, after discussing the needs in general, with regard to challenges inherent to meeting them with the TopCount() function in particular, we constructed queries to meet the expressed requirements using combinations of TopCount() and other MDX functions we have explored in articles of the MDX Essentials series. In both practice examples, we discussed the syntax contained within the solutions we constructed for the information consumers, as well as the datasets we obtained in employing TopCount() and other functions, together with other surrounding considerations. » See All Articles by Columnist William E. Pearson, III Discuss this article in the MSSQL Server 2000 Analysis Services and MDX Topics Forum. MDX Essentials Series
The LEVEL_NUMBER Member Property
The LEVEL_UNIQUE_NAME Intrinsic Member Property Intrinsic Member Properties: The HIERARCHY_UNIQUE_NAME Property Intrinsic Member Properties: The DIMENSION_UNIQUE_NAME Property Further Combination of BottomCount() with Other MDX Functions Combine BottomCount() with Other MDX Functions to Add Sophistication Basic Set Functions: The BottomCount() Function, Part I Intrinsic Member Properties: The MEMBER_VALUE Property Intrinsic Member Properties: The MEMBER_UNIQUE_NAME Property Intrinsic Member Properties: The MEMBER_NAME Property Intrinsic Member Properties: The MEMBER_KEY Property Intrinsic Member Properties: The MEMBER_CAPTION Property Set Functions: The StripCalculatedMembers() Function Set Functions: The AddCalculatedMembers() Function MDX Numeric Functions: The Min() Function MDX Numeric Functions: The Max() Function Set Functions: The .AllMembers Function MDX Essentials: Set Functions: The MeasureGroupMeasures() Function String Functions: The .Properties Function, Part II String Functions: The .Properties Function Logical Functions: IsGeneration(): Conditional Logic within Filter Expressions MDX Scripting Statements: Introducing the Simple CASE Statement Logical Functions: IsGeneration(): Conditional Logic within Calculations Logical Functions: IsAncestor(): Conditional Logic within Filter Expressions MDX Clauses and Keywords: Use HAVING to Filter an Axis Logical Functions: IsAncestor(): Conditional Logic within Calculations Logical Functions: IsSibling(): Conditional Logic within Filter Expressions Logical Functions: IsSibling(): Conditional Logic within Calculations MDX Operators: The IsLeaf() Operator: Conditional Logic within Filter Expressions MDX Operators: The IsLeaf() Operator: Conditional Logic within Calculations MDX Numeric Functions: The .Ordinal Function Other MDX Entities: Perspectives MDX Operators: The IS Operator MDX Set Functions: The Distinct() Function MDX Set Functions: The ToggleDrillState() Function Set Functions: The DrillUpLevel() Function Set Functions: The DrillDownLevelTop() and DrillDownLevelBottom() Functions MDX Set Functions: DrillDownLevel() MDX Set Functions: The DRILLUPMEMBER() Function MDX Essentials: Set Functions: The DRILLDOWNMEMBERTOP() and DRILLDOWNMEMBERBOTTOM() Functions MDX Essentials : Set Functions: The DRILLDOWNMEMBER() Function MDX Essentials: Drilling Through with MDX: The DRILLTHROUGH Statement MDX Essentials: String Functions: The .UniqueName Function MDX Essentials: String Functions: The .Name Function MDX Essentials: String / Numeric Functions: The CoalesceEmpty() Function MDX Essentials: Basic Set Functions: The TopCount() Function, Part II MDX Essentials: Basic Set Functions: The TopCount() Function, Part I MDX Essentials: Enhancing CROSSJOIN() with Calculated Members MDX Essentials: Set and String Functions: The GENERATE() Function MDX Essentials: The CROSSJOIN() Function: Breaking Bottlenecks MDX Essentials: String / Numeric Functions: More on the IIF() Function MDX Essentials: String / Numeric Functions: Introducing the IIF() Function MDX Essentials: Logical Functions: The IsEmpty() Function MDX Essentials: Basic Set Functions: The EXTRACT() Function MDX Essentials: Numeric Functions: Introduction to the AVG() Function MDX Essentials: Basic Member Functions: The .Item() Function MDX Essentials: Basic Set Functions: Subset Functions: The Subset() Function MDX Essentials: Basic Set Functions: Subset Functions: The Tail() Function MDX Essentials: Basic Set Functions: Subset Functions: The Head() Function MDX Essentials: Basic Set Functions: The CrossJoin() Function MDX Essentials: Basic Numeric Functions: The Count() Function MDX Essentials: Basic Set Functions: The Filter() Function MDX Essentials: Basic Set Functions: The EXCEPT() Function MDX Essentials: Basic Set Functions: The Intersect() Function MDX Essentials: Basic Set Functions: The Union() Function MDX Essentials: Basic Set Functions: The Order() Function MDX Essentials - MDX Time Series Functions, Part III: The LastPeriods() and ParallelPeriod() Functions MDX Time Series Functions, Part II: The OpeningPeriod () and ClosingPeriod() Functions MDX Essentials - MDX Time Series Functions, Part I: PeriodsToDate() and Kindred Functions MDX Essentials: MDX Member Functions: "Relative" Member Functions MDX Member Functions: The Cousin () Function MDX Essentials: Member Functions: More "Family" Functions MDX Member Functions: The "Family" Functions MDX Essentials: MDX Members: Introducing Members and Member MDX Essentials : MDX Operators: The Basics MDX Essentials: Structure of the MDX Data Model MDX at First Glance: Introduction to SQL Server MDX Essentials |