SSAS Orderby for custom buckets on Dimension - ssas

i got a Cube Dimension containing:
fooBucket
fooValue
fooBucket is already evaluated with SQL, so an example could be
fooBucket = 50-99
fooValue = 76
I then made a hierarchy fooBucket -> foo and everything works just fine.
The Problem now is, that the Buckets are ordered lexicographic that means i have the followng order:
0-49
100-149
150-199
50-99
..
and so on. How can i possibly change the order of that DimensionAttribute "bucket" when i cannot just say order by int because clearly it is no int... :(

Just add another column, maybe named "fooOrder", to your table or view that the dimension is based on. This column should be an integer (possibly just the number before the hyphen of the range).
Then add that as attribute to your dimension, and define a relationship from fooBucket to it. Set the "OrderByAttribute" property of fooBucket to "fooOrder" and the "OrderBy" property to "AttributeKey". Finally, set the "AttributeHieararchyEnabled" property od "fooOrder" to false.

Related

How to concatenate hidden cube dimension and measure with an MDX query?

I have a cube with three (relevant) dimensions (quarter, element and qualifier). The measure of interest is score, which is numeric.
The qualifier dimension is sparse, i.e. for each unique combination of quarter and element, the measure score is reported only for one qualifier, for the other members of the qualifier dimension the measure score is blank. Which qualifier is 'active' entirely depends on the quarter and element.
I want to build a table with quarter members as columns and element members as rows. The cell values should be the concatenation of the score measure and the name of that qualifier member (string) for which the score at the relevant intersection of quarter, element and qualifier is not blank.
To make matters more complex, one of the member names of the qualifier needs to be replaced with blanks in the table. There are four distinct members, which should be renamed in the table as follows: the member names '+', '-', '' stay as they are, while the name 'No Qualifier' should become blank, i.e. ''.
Below is an example of the structure I would like to get (note that there should be no '+' or '-' in case the corresponding score is reported in either the qualifier members '' or 'No Qualifier'):
2021Q4
2020Q4
2019Q4
Element 1
3
2+
2
Element 2
1
1
1
Element 3
2
3
2+
Element 4
2-
2-
3
I suppose I would need to create a calculated member, but so far I only get the concatenation and replacement to work with the currentmember function if I include the qualifier dimension explicitly in either rows or columns, which however is not a feasible output structure. Also, changing the underlying cube is not possible (it is maintained by IT).
I am new to cubes and MDX and have already spent two days trying to figure this out by myself. Since this is a work project, I am starting to panic. Any help would really be appreciated!

Not Specifying an Axis

I am trying to write an MDX Code which has all the members of my cube in the row. However when I specify the row, it mentions that I must ALSO specify Columns. But if I do not set an ON ROW nor an ON Column, my code does not validate.
How do I put all my members in a row, and have a single data column be returned?
In mdx ON COLUMNS is axis 0 and ON ROWS is axis 1. For an mdx statement to be valid it must have at least an axis 0 .... this is one of the rules of the language, no getting around it.
Quite often if I need lots of information in my ON ROWS but the columns needs to be a single column then I will select a dimension I am not using e.g. Language, and then use that selected dimensions ALL member for COLUMNS - just to obey the rule. e.g.
SELECT
[Language].[Language].[All] ON 0, //<<JUST A DUMMY ENTRY BUT MUST BE AN ALL MEMBER OF A DIMENSION
...
...

using a named set in a calculated member

I have a calculated field (getting a count) and a named set (defines a key) which I want to use in a new calculated member and return the count based on when the key is defined in that set.
So far i have tried this:
([Measures].[Person ID Distinct Count], [SET]) and
([Measures].[Person ID Distinct Count], {[SET]})
Just on a side note, I for this discount count in 2 steps:
I first did a count on the table using new measure... option from cube structure pane, then used it in a calculation to define the year of count i want. And now I am here. My mdx above didn't work but however in the browser i can pull the count (where its filtered by year) and use the set as a slice and it works fine. But I want this defined in a calculation.
This signifies a tuple (....)
A tuple is made up of members - so a set cannot be used as an argument.
You need to aggregate your set separately to create a member:
Aggregate([SET])
The memeber can then be used in the tuple you mention:
([Measures].[Person ID Distinct Count], [SomeDim].[SomeHierarchy].[All].[AggregatedSET])

SSAS MDX Calculated Measure Based on Related Dimension Attribute Value

I have a measure [Measures].[myMeasure] that I would like to create several derivatives of based on the related attribute values.
e.g. if the related [Location].[City].[City].Value = "Austin" then I want the new calculated measure to return the value of [Measures].[myMeasure], otherwise, I want the new calculated measure to return 0.
Also, I need the measure to aggregate correctly meaning sum all of the leaf level values to create a total.
The below works at the leaf level or as long as the current member is set to Austin...
Create Member CurrentCube.[Measures].[NewMeasure] as
iif(
[Location].[City].currentmember = [Location].[City].&[Austin],
[Measures].[myMeasure],
0
);
This has 2 problems.
1 - I don't always have [Location].[City] in context.
2. When multiple cities are selected this return 0.
I'm looking for a solution that would work regardless of whether the related dimension is in context and will roll up by summing the atomic values based on a formula similar to above.
To add more context consider a transaction table with an amount field. I want to convert that amount into measures such as payments, deposits, return, etc... based on the related account.
I don't know the answer but just a couple of general helpers:
1 You should use IS rather than = when comparing to a member
2 You should use null rather than 0 - 0/NULL are effecitvely the same but using 0 will slow things up a lot as the calculation will be fired many more times. (this might help with the second section of your question)
Create Member CurrentCube.[Measures].[NewMeasure] as
iif(
[Location].[City].currentmember IS [Location].[City].&[Austin],
[Measures].[myMeasure],
NULL
);

Limit dimension values displayed in QlikView Pivot Table Chart

I have a pivot table chart in QlikView that has a dimension and an expression. The dimension is a column with 5 possible values: 'a','b','c','d','e'.
Is there a way to restrict the values to 'a','b' and 'c' only?
I would prefer to enforce this from the chart properties with a condition, instead of choosing the values from a listbox if possible.
Thank you very much, I_saw_drones! There is an problem I have though. I have different expressions defined depending on the category, like this:
IF( ([Category]) = 'A' , COUNT( {<[field1] = {'x','y'} >} [field2]), IF ([Category]) = 'B' , SUM( {<[field3] = {'z'} >} [field4]), IF (Category='C', ..., 0)))
In this case, where would I add $<Category={'A','B','C'} ? My expression so far doesn't help because although I tell QV to use a different formula/calculation for each category, the category overall (all 5 values) represents the dimension.
One possible method to do this is to use QlikView's Set Analysis to create an expression which sums only your desired values.
For this example, I have a very simple load script:
LOAD * INLINE [
Category, Value
A, 1
B, 2
C, 3
D, 4
E, 5
];
I then have the following Pivot Table Chart set up with a single expression which just sums the values:
What we need to do is to modify the expression, so that it only sums A, B and C from the Category field.
If I then use QlikView's Set Analysis to modify the expression to the following:
=sum({$<Category={A,B,C}>} Value)
I then achieve my desired result:
This then restricts my Pivot Table Chart to displaying only these three values for Category without me having to make a selection in a Listbox. The form of this expression also allows other dimensions to be filtered at the same time (i.e. the selections "add up"), so I could say, filter on a Country dimension, and my restriction for Category would still be applied.
How this works
Let's pick apart the expression:
=sum({$<Category={A,B,C}>} Value)
Here you can recognise the original form we had before (sum(Value)), but with a modification. The part {$<Category={A,B,C}>} is the Set Analysis part and has this format: {set_identifier<set_modifier>}. Coming back to our original expression:
{: Set Analysis expressions always start with a {.
$: Set Identifier: This symbol represents the current selections in the QlikView document. This means that any subsequent restrictions are applied on top of the existing selections. 1 can also be used, this represents the full set of data in your document irrespective of selections.
<: Start of the set modifiers.
Category={A,B,C}: The dimension that we wish to place a restriction on. The values required are contained within the curly braces and in this case they are ORed together.
>: End of the set modifiers.
}: End of the set analysis expression.
Set Analysis can be quite complex and I've only scratched the surface here, I would definitely recommend checking the QlikView topic "Set Analysis" in both the installed helpfile and the reference manual (PDF).
Finally, Set Analysis in QlikView is quite powerful, however it should be used sparingly as it can lead to some performance problems. In this case, as this is a fairly simple expression the performance should be reasonable.
Woa! a year later, but what you are loking for is osmething near this:
Go to the dimension sheet, then select the Category Dimension, and click on the Edit Dimesnion button
there you can use something like this:
= If(Match(Category, 'a', 'b', 'c'), Category, Null())
This will make the object display only a b and c Categories, and a line for the Null value.
What leasts is that you check the "Suppress value when null" option on the Dimension sheet.
c ya around
Just thought another solution to this which may still be useful to people looking for this.
How about creating a bookmark with the categories that you want and then setting the expressions to be evaluated in the context of that bookmark only?
(Will expand on this later, but take a look at how set analysis can be affected by a bookmark)