Power BI - DAX - Cannot be Converted to a Scalar Value - powerbi

I think there's nothing wrong with this, but PBI disagrees:
The expression refers to multiple columns. Multiple columns cannot be converted to a scalar value.
I want this to do more, but I have it stripped down to the bare minimum requirements for troubleshooting. I've tried all kinds of tricks, but nothing seems to be working.
Summarize = SUMMARIZE(
MailboxStatisticsHistorical,
MailboxStatisticsHistorical[Date],
"Distinct", DISTINCTCOUNT(MailboxStatisticsHistorical[Identity])
)

SUMMARIZE returns a calculated table. You can't assign it to a measure. (Measures expect scalar results.) Use the Calculated Table UI instead.

Related

same DAX query resulting in different results

For a table (having 2 rows and 3 columns namely City1,Price1 & Units1) in power bi, I created a new column (named 'salesColumn') and a new measure (named 'salesMeasure) with the below DAX queries
salesColumn = SUMX('Table', 'Table'[Price1] * 'Table'[Units1])
salesMeasure = SUMX('Table', 'Table'[Price1] * 'Table'[Units1])
This resulted in the following visual:
As seen above, formula for both the column & measure are same but still they give different results. While salesColumn gives 6572 (12*175 + 18*229) in both rows, salesMeasure gives the row wise product. Can anyone please let me know why the behaviour is different in the two cases while we are using the same formula ? SUMX is a function to which we are passing the same arguments. If we are passing same arguments to a function, the function should behave in the same manner, but it is not so. Is there any hidden argument being passed to SUMX ? Can anyone please explain what is happening here & possibly paste some relevant links to understand this better ?
This Two calculation should give you different output, the reason is that the SaleColumn are calculated only once at refresh time (The DAX expression defined for a calculated column operates in the context of the current row across that table.) --> you calculate a value for all rows (look at the summary from salesMeasure), while SaleMeasure is dynamic.
Even if they look similar, there is a big difference between
calculated columns and measures. The value of a calculated column is
computed during data refresh and uses the current row as a context; it
does not depend on user interaction in the report. A measure operates
on aggregations of data defined by the current context, which depends
on the filter applied in the report – such as slicer, rows, and
columns selection in a pivot table, or axes and filters applied to a
chart.
https://www.sqlbi.com/articles/calculated-columns-and-measures-in-dax/

How to use Measures in Calculated column Formula in PBI

I'm trying to use a previous calculated Measure in a Calculated Column in PBI, but i get the error "expressions that yield variant data-type cannot be used to define calculated columns", how can i fix this? this is my code
Critical_Detrended = 1*(1+[Trend])
Thanks
Calculated columns are static. They are calculated once, when the data is loaded. Their values cannot change. Thus, you can't use something dynamic, like measures, because measures are responsive, they are re-computed when the user selects something, changes the value of a slicer, etc.
The solution in your case is to change your calculated column to be a measure too.
You could take a look for example at Calculated columns and measures in DAX article.
While calculated columns are not responsive to any slicers or filters set on your report, you absolutely can use measures in a calculated column definition so long as you understand how the row context to filter context transition works and don't expect the calculated column to be dynamically responsive.
That said, the error you are getting sounds like [Trend] may output different data types in different situations but a column can only be a single data type. A non-obvious case where this sort of thing happens is when a measure sometimes outputs an integer and other times outputs a decimal type. In a case like that, you can force it to return a decimal type by multiplying by 1.0 or adding 0.0 or similar manner of type coercion. In your case, changing one of the 1 to 1.0 might do the trick if that's indeed the problem.

Cant measure from date column

I'm trying to count days between a date from the column 'completionDate' and today
The table name is 'Incidents (2)'
I have a simuler table called 'incidents' here it's working.
The code:
DaysClosed = DATEDIFF('Incidents (2)'[completionDate].[Dag];TODAY();DAY)
The error i get:
'A single value for variaton 'Dag' for column 'completionDate' in table 'Incidents (2)' cannot be determined. This can happen when a measure formula refers to a column that contains many values without specifying an aggregation such as min, max, count, or sum to get a single result.'
The error you get strongly depends on how you are evaluating your formula, that's why it might work on another table but not on this one. As #JBfreefolks pointed out correctly you are specifying a column where a scalar value is expected. That can work depending on the context you are evaluating your formula over (assuming it is a measure).
For instance, imagine a data-set with 100 rows equally divided into four categories A,B,C,D. When you create a table visual with a row for each category, each row will have 25 underlying records that will be used in any calculation added to this row (either a measure or an aggregate of any value). This means that when using a formula like datediff with a column reference, it will get 25 values for it's second argument where it expects one.
There are several ways to solve the problem depending on your desired result.
Use a measure like MAX like #JBfreefolks suggested to make sure that a single value is selected from multiple values. The measure will still be calculated over a group of records but will summarize it by taking the maximum date.
Make sure the visual you are using has something like an ID in there so it doesn't group, it displays row context. Any measure added to this visual will evaluate in row context as well.
Use a calculated column instead. They are always evaluated in row context first and their values can be aggregated in a visual later on. When using TODAY() , you probably need to refresh your report at least every day to keep the column up to date.
A more complicated way is to use an iterator like SUMX() or AVERAGEX() to force row context evaluation inside of a measure.
Good to see you solved it already, still posting as it might be helpful to others.
'Incidents (2)'[completionDate].[Dag] referencing a colomn. It is in your computation returning a table (multiple date in the evaluation context) instade of a scalar needed in DATEDIFF calculation.
You need to leverage to be sure that 'Incidents (2)'[completionDate].[Dag] is rturning a scalar value. To do that you can leverage rowcontext and then also formula like Max.

Nested Context using ALLEXCEPT and ALLSELECTED

I am facing a problem right now that I can’t find the answer to in any online research.
I have a calculated measure as follows…
top_selected_tier:=CALCULATE(
min(Table1[waterfall_tier]),
ALLSELECTED(Table1)
)
…that shows the correct value in the measure pane, after slicing the [waterfall_tier] field (using either slicers or filter dropdowns).
However, when I reference that measure in a calculated column…
[test_top_tier]=[top_selected_tier]
… I get a different value. It essentially returns the lowest value in the table, irrespective of which set of filters/slicers are applied.
What I need to test for is whether the field [waterfall_tier] at the row level matches the currently lowest value for [top_selected_tier] that is selected via slicers as reported in the measure pane.
Similarly, in another calculated column I am trying to do a sum of all “filled” requests in the table for a given date, and I don’t know how to construct the formula to only sum the selected values (via slicer/filter dropdown). Instead this formula sums all the values for that day, irrespective of the set of filters/slicers applied.
[all_filled]=CALCULATE(
sum([requests]),
FILTER(ALLEXCEPT(Table1,Table1[request type],Table1[date]),
[request type]="filled"
)
)
In effect I need the formula to return an ALLEXCEPT on the ALLSELECTED subset of table… if that makes sense?
Please note the features of the CALCULATE:
New filter context is added.
The function transform existing row contexts into an equivalent filter context.
The preceding simultaneous occurrence.
Calculated columns are not dynamic, that's why you are getting a fixed value. (see this article)
One important concept that you need to remember about calculated columns is that they are computed during the database processing and then stored in the model.
This means that the column value is evaluated only once, in the beginning, when there are no filters yet, and therefore the "ALLSELECTED" dataset is the whole table.
In PowerBI (sadly) you cannot create a dynamic column.

Access to fields in IF sentence in DAX in Power BI Desktop

When I use SUM for example the intellisense of the editor shows me the columns of my table but when I use IF or Switch I'm not shown any column.
In this example of If (https://powerbi.microsoft.com/es-es/documentation/powerbi-desktop-tutorial-create-calculated-columns/) the column between [] works fine but when I put my column between [] I have error
error if
Any idea please?
Regards
I can see you are creating a measure while in the tutorial they are creating a calculated column. Measures and Calculated columns behave different, while creating a calculated column the expression you are using takes the context of each row so you can reference any column directly by [Column].
However measures evaluate in different context so they need an aggregation function to determine the value of your columns.
EXAMPLE: Calculated Column.
Is Red Calculated Column = IF([Color]="Red","Yes","No")
EXAMPLE: Measures.
Is Red Measure = IF(FIRSTNONBLANK([Color],0)="Red","Yes","No")
Note I used FIRSTNONBLANK aggregation function to access the [Color] column from a measure.
The above expression could not work for you depending on your measure, I only posted it for example purposes.
I found the answer
TotalHoras = SUMX(Horas;if(Horas[Tipo]="M";Horas[Duration]/60;Horas[Duration]))
Like #alejandrozuleta says Measures need an aggregation function to works