SSAS 2017 - IF statement in calculated measure with condition from dim table - ssas-tabular

I am trying to get sum of fact table column based on dimension table column value. ie.
If Dim_Product[Origin]="A"
THEN SUM(Fact_Connectivity[MONITOR_CNT])
ELSE
SUM(Fact_Connectivity[TLA_MONITOR_CNT]).
I am using below formula:
Adoption %:= IF(Dim_Product[Origin]="A",
SUM(Fact_Connectivity[MONITOR_CNT]),
SUM(Fact_Connectivity[TLA_MONITOR_CNT]))
But I couldn't use Dim_Product[Origin] table fields in the formula even though Fact table has relationship with Dim table.

You can't directly use it in a measure, raw, or using related, you will have to wrap it round with something to determine the row context.
So for example,
Measure = IF(MAX('Dim Origin'[Origin]) = "A"
, SUM('Table'[Monitor_cnt])
, SUM('Table'[TLA_Monitior_cnt])
)
So on a row by row basis It will take the MAX value for that row, then apply the function. AS the row will only have one value the logic works.
You could also move this to a calculated column.
Hope that helps

Related

how to multiply variable to each element of a column in database

I am trying to add a column to a collection by multiplying the 0.9 to existing database column recycling. but I get a run time error.
I tried to multiply 0.9 direction in the function but it is showing error, so I created the class and multiplied it there yet no use. what could be the problem?
Your error message is telling you what the problem is: your database query is using GROUP BY in an invalid way.
It doesn't make sense to group by one column and then select other columns (you've selected all columns in your case); what values would they contain, since you haven't grouped by them as well (and get one row returned per group)? You either have to group by all the columns you're selecting for, and/or use aggregates such as SUM for the non-grouped columns.
Perhaps you meant to ORDER BY that column (orderBy(dt.recycling.asc()) if ascending order in QueryDSL format), or to select all rows with a particular value of that column (where(dt.recycling.eq(55)) for example)?

SUMX is giving same value for all the rows

I have a fact table with columns as Quantity, Unit Price, etc. I am trying to calculate the revenue with the SUMX formula but I am getting the same value for all the records. And due to this I am also getting a dependency error in other column. Here is the code:
SUMX(
'''Sales Details$''',
'''Sales Details$'''[Quantity]*'''Sales Details$'''[Unit Price]
)
This table has been imported from SSMS as it is, into the tabular model analysis service in VS2019.
I wish to understand few things here-
Why we have to provide a table inside of 3-quotes? The DAX bar is not taking the table without specifying them under 3-quotes.
SUMX shouldn't evaluate the same value for all the records. But it is doing here for an unknown reason.
If I try to replace the [Unit Price] with [Unit Cost] in the upper code then I am getting a dependency error in the new column. As far as I know, I am not using a CALCULATE function which will generate circular dependency and SUMX doesn't puts the filter on columns, [Quantity] here.
I think it is because the table name has spaces. When a table name has spaces or not allowed characters it goes between two single quotes: ""
If I'm not wrong (I'm quite new with DAX too), SUMX is like sumproduct in Excel. It does the unit price * quantity per row and then sums up all the rows, breaking the row context. If you want to calculate the amount per row, just do price * quantity, without SUMX.
I don't know, sorry.

Function to call the Name of a column in TABLEAU

I have a problem with Tableau.
I have a Dataset with some rows and some columns. I want to write a IFELSE structure where
The IF condition is that the Value of special field(fixed by a row and a column) is equal to the header of a column (it is every time equal to one name(header) of the different columns).
So to summarize: one value is every time equal to the name of a column and to find the column shall be the if-structure
Does someone know if there is a function to call the name (header) of a column? I didn't find it
Here is an small example, in which the Calculated_function choose the right price according to the Barcode. Everything in the first raw, is the header_name of the column below. enter image description here
Best regards
Jonas
You can work like this.
I created a sample dataset as given by you
Step-1: Connected With data in tableau. Clicked all columns having price (4 here), pivoted them so that they look like this..
Step_2: Create calculated_field like this
if [Barcode] = [Barcode_c]
then [Price] END
Step3: Filtered out null values from calculatedField and got a view like this which can be tweaked as per liking.

SSRS Grouping Summary - with Max not working

This is the data that comes back from the database
Data Sample for one season (the report returns values for two):
What you can see is groupings, by Season, Theater then Performance number and lastly we have the revenue and ticket columns.
The SSRS Report Has three levels of groupings. Pkg (another ID that groups the below), venue -- the venue column and perf_desc -- the description column linked tot he perf_no.
Looks like this --
What I need to do is take the revenue column (a unique value) for each Performance and return it in a separate column -- so i use this formula.
sum(Max(Fields!perf_tix.Value, "perf_desc"))
This works great, gives me the total unique value for each performance -- and sums them up by the pkg level.
The catch is when i need to pull the data out by season.
I created a separate column looks like this
it's yellow because it's invisible and is referenced elsewhere. But the expression is if the Season value = to the Parameter (passed season value) -- then basically pull the sum of each of the tix values and sum them up. This also works great on the lower line - the line where the grouping exists for pkg -- light blue in my case.
=iif(Fields!season.Value = Parameters!season.Value, Sum(Max(Fields!perf_tix.Value, "perf_desc")), 0)
However, the line above -- the parent/header line its giving me the sum of the two seasons values. Basically adding it all up. This is not what I want and also why is it doing this. The season value is not equal to the passed parameter for the second season value so why is it adding it to the grouped value.
How do I fix this??
Since your aggregate function is inside your IIF function, only the first record in your dataset is being evaluated. If the first one matches the parameter, all records would be included.
This might work:
=IIF(Fields!season.Value = Parameters!season.Value, Sum(Max(Fields!perf_tix.Value, "perf_desc")), 0)
It might be better if your report was also grouping on the Venue, otherwise you count may include all values.

Retrieving value from previous row in calculated column based on condition

I am working on data in Spotfire. The table has 4 columns:
RowID
StudID
IMT
Date
I am trying to insert a calculated column in Spotfire to get the date from the previous row for a specific StudID. The date should not be filled for first entry for a specific StudID since it does not have a previous row.
Please refer to the image for details:
This will be a calculated column using the OVER function, along with Intersect, Previous and the First aggregation.
First([Date]) OVER Intersect(Previous([Date]), [StudID])
It reads: over the intersection between (group of) the previous (to the current row) dates (which are the same) and the Student ID's (the same as the current row), give me the first row of that group. In your example, it will only ever return one date for that group, but the formula needs to be able to handle what happens if there are multiple rows. You may also need to think about whether this will happen in your data and what you're going to do about it. I.e.
StudID Date
124-639 6/12/2018
124-639 6/12/2018
124-639 6/14/2018
Building off of JasonJ's answer, it looks like his solution ran into issues when the dates of different StudIDs overlapped with one another.
So I was seeing something along the lines of this:
StudID, Date, Result
A, 10/1/2014,
A, 10/10/2014, 10/1/2014
A, 10/17/2014, 10/10/2014
B, 10/20/2014,
A, 10/21/2014,
B, 10/22/2014,
B, 10/24/2014, 10/22/2014
I created a weird workaround by adding another Calculated Column.
I doubt this is the IDEAL way to do this (I'd bet there's a better OVER function, but I couldn't identify it right off), but it looks like it's working.
First Calculated Column (Named [CalcRank]):
Rank(Concatenate([StudID],Year([Date]),If(DayOfYear([Date])<10,"0",""),If(DayOfYear([Date])<100,"0",""),DayOfYear([Date])))
Second Calculated Column:
Max([Date]) OVER (Intersect(Previous([CalcRank]),[StudID]))
Please note, you may have to pad your StudID with 0s to make sure it orders properly, like I did with the Date column.