My scenario is like that:
I have a table containing answers from a survey with two questions;
Each question has only three possible options: "yes", "no", "n/a".
What I need is a bar chart that shows how many questions with "yes" I have for each question. The final chart should have two colunms, one labeled "Q01" and other "Q02" (those are the names of the columns), each column counting the "yes" for the corresponding question.
That should be simple with filters and a clustered bar chart. Set the two columns (Q01 and Q02) to Y axis and one filter to each column to select only "yes". However, when I set the two columns together Power BI displais both columns with the same size, with what looks like the intersection of the both columns.
How to fix it?
Sample data
This is a simple example:
Generated from Sample = {(1, "yes", "yes"),(2, "no", "yes"),(3, "no", "yes"),(4, "yes", "no"),(5, "yes", "yes")}
The result is
Import your data into power query.
Select id columns and then unpivot other columns from the ribbon.
Close and apply.
Add a measure:
Measure = CALCULATE(COUNTROWS('Table'), 'Table'[Value] = "yes")
Add a stacked bar and add the following to the field well.
Related
I'm trying to use Google's monthly budget template and alter it so I can get a full view of the year. I have tabs Jan-Dec made but I can't figure out how to add them to the below formula. When I try, it tells me that the IF can only use 3. The areas Expenses and Income in the screenshot should total up the Amounts (column C) with their respective category (Column E).
The same would be said for income using Columns H and J.
=if(isblank($B36), "", sumif(January!$E:$E,$B36,January!$C:$C))
Here is the link to my sheet https://docs.google.com/spreadsheets/d/1MTL3xdN-0W4vS7e_yO1C4qkFAxlsxhx3SLXyml78qOc/edit?usp=sharing
delete E28:E41 and try in E28:
=BYROW(B28:B41, LAMBDA(b, IF(b="",,
IFERROR(QUERY({January!C:E; February!C:E; March!C:E;
April!C:E; May!C:E; June!C:E; July!C:E; August!C:E;
September!C:E; October!C:E; November!C:E; December!C:E},
"select sum(Col1) where Col3 = '"&b&"' label sum(Col1)''", ), 0))))
Update:
In order to make it cover the whole range of Categories with the same principle of having the flexibility of a list of Sheets' Names, you can use this formula:
=INDEX(IF(ISBLANK(B28:B41),"",REDUCE(,A28:A,LAMBDA(a,sh,
a+SUMIF(INDIRECT(sh&"!$E:$E"),B28:B41,INDIRECT(sh&"!$C:$C"))))))
I've set it in your sheet too in a new column to the right
If you stablish a list of sheets' names in a range, you can use this formula:
=if(isblank($B36),"",REDUCE(,A2:A,LAMBDA(a,sh,
a+SUMIF(INDIRECT(sh&"!$E:$E"),$B36,INDIRECT(sh&"!$C:$C")))))
I'm beginning to think that what I'm looking for isn't actually possible.
I have two datasets - one of Titles and one of Keywords. Only one column from each is relevant to this query - Titles[Title] and Keywords[Keyword]. So pretty straightforward data. Titles has around 2 million rows, and Keywords will eventually have ~500-1000.
I would like to display a slicer of Keywords[Keyword] values, which will filter the Titles dataset where Titles[Title] contains one of the selected Keywords[Keyword] values.
I tried creating a DAX calculated column on Titles like below -
Matches = IF(SUMX(FILTER('Keywords','Keywords'[Keyword] <> ""),FIND(UPPER('Keywords'[Keyword]), UPPER(Titles[Title]),,0)) > 0,1, 0)
I then apply a report level filter for Matches >= 1. This works for all keyword values, but is not aware of the selection in the slicer.
I tried changing it to use ALLSELECTED('Keywords'[Keyword]) as the first argument passted to FILTER, but this doesn't seem to have any effect.
As a test, I created a Calculated Column and a Measure with the exact same DAX -
CONCATENATEX(VALUES(Keywords[Keyword]), Keywords[Keyword], ",")
This displays the slicer selection delimited by commas for the measure, but not for the column. Since I want to calculate this per row and filter the report based on this, a measure isn't suitable.
Is there any other way I can refer to the filtered Keywords[Keyword] in my calculated column? Or is there a way that a Measure could actually be used to achieve this? Or is there a completely different approach that I could try?
I want to count records in a certain condition and allow people to filter down to the relevant records, but selecting a measure value (which filters so it only counts certain rows) isn't cross-filtering others as I'd expect. Maybe ths isn't possible or maybe I'm just doing it wrong, but I'd appreciate help.
I have a single table:
let
Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45Wci4tLsnPTS1SMFTSUTJUitVBEjICChmgChljCplgajSFCMUCAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [#"Customer Name" = _t, #"Ordered Recently" = _t]),
#"Change to INT" = Table.TransformColumnTypes(Source,{{"Ordered Recently", Int64.Type}}),
#"Change to T/F" = Table.TransformColumnTypes(#"Change to INT",{{"Ordered Recently", type logical}})
in
#"Change to T/F"
The result looks like this:
Customer Name Ordered Recently
Customer 1 True
Customer 2 False
Customer 3 False
Customer 4 True
Customer 5 True
I added two measures:
Count Total = COUNTROWS(Customers)
Count Recent = CALCULATE([Count Total], filter(Customers, Customers[Ordered Recently]))
If I put both measures in a bar chart and highlight the "Count Recent" measure, I'd expect it to know to filter other visuals based on the FILTER statement present in the measure, but that doesn't happen. Selecing this value doesn't impact anything else on my page (including just a count of rows).
The goal is to allow people to select a measure that counts rows and then to see the makeup of the data in those rows (select a count of late projects and filter other visuals to describe those late projects).
Is this possible or am I doing something wrong?
EXAMPLE:
Here's what it looks like now, with nothing selected:
When I select the black bar (the "Ordered Recently" measure), nothing changes right now - but here's what I want to happen (actually achieved with a slicer off screen on the T/F field):
I understand if my measure is a SUM of an integer field, it includes every row in the calculation - even when the row value is zero - and there's no way to filter my dataset based on that. However, in this case, my measure is actually using a FILTER on the dataset so that it only counts rows with a certain criteria set - given that, it should be able to filter the requested table, and then flow that filter through the rest of my dataset (the same way it would if I selected a bar from a chart where I had used that same field as the series - exactly how it works when I do this:
PBIX file to download as an example
No, I don't believe it's possible to make a measure value cross-filter other visuals based on filters within the measure definition.
You can, however, click on i.e. row header Customer 3 and it should cross-filter the other visuals to only include that customer. Any table column you set for the rows or columns of a matrix visual should behave this way.
Here's a hacky workaround:
Create a measure that shows the right values when you use the column you want to use as a filter as the Legend or Axis (like in your last image). For example, in this case, you could do this:
Total Customers =
VAR TF = SELECTEDVALUE ( Customers[Ordered Recently] )
RETURN
COUNTROWS (
FILTER (
ALLSELECTED ( Customers ),
IF ( TF, TF, TF || Customers[Ordered Recently] )
)
)
This behaves how you want, but isn't labeled as you want. To achieve that create a calculated column with the labels you want. For example,
Label = IF(Customers[Ordered Recently], "Ordered Recently", "Total Customers")
Then take Ordered Recently off the axis and put the Label column in the Legend box to get this:
Your Filter argument is really Filter(All(Customers, Customers[Ordered Recently])
You remove all filters on the Customer Table, and then specify Ordered Recently Column as the filter.
Try
[MeasureName] =Calculate([Count Total], All(Customer), Values(Customer[Recently Ordered]), Customer[Recently Ordered] = “True”)
Need some advise on how to filter data when in "Country" column is selected as "All" then consider only specific value which is in different column(Raw) else calculate respective values(column Coverage) for respective Countries
There are 3 columns - Country, Coverage and Raw
Basically when selected as "ALL" it considers total of coverage column but I want it to consider a single value from Raw column
Note - I'm using this in Line chart in Power BI
Thank you in advance!
You can create measures that have different behaviors for different filter conditions using functions like ISFILTERED or HASONEVALUE. For example:
Measure = IF(ISFILTERED(Table1[Country]), <Calculation 1>, <Calculation 2>)
or
Measure = IF(HASONEVALUE(VALUES(Table1[Country])), <Calculation 2>, <Calculation 1>)
I am using Power BI to bring together data from several systems and display a dash board with data from all of the systems.
The dashboard has a couple of filters which are then used to display the data relating to one object across all systems.
When the dashboard is first loaded and none of the filter have been selected, the data cards display information from all rows in the table.
Is there a way to make a data card only display one row of data?
or
Be blank if there are more than one row of data?
There's no direct way to look at the number of rows in the visual, count them, and do something different if there's more than 1.
That said, there are a few things you can do.
HASONEFILTER
If you have a specific column in your table that, when selected, filters your results to a single row, then you can check if there's a filter on that column using HASONEFILTER. (If you have multiple alternative columns,any of which filter to a single row, that's ok too.)
You could then create a measure for each column that tests HASONEFILTER. If true, return the MAX of the column. (The reason for MAX is because measures always have to aggregate, but the MAX of a 1-row column will be the same as the value in that column.) If false, return either BLANK() or an empty string, depending on your preference.
E.g.
ColumnAMeasure = IF(HASONEFILTER(Sheet1[Slicer Column]),MAX(Sheet1[COLUMN A]), "")
ColumnBMeasure = IF(HASONEFILTER(Sheet1[Slicer Column]),MAX(Sheet1[COLUMN B]), "")
where Sheet1 is the name of the table and "Slicer Column" is the name of the column being used as a slicer
HASONEVALUE
If you have multiple columns that could be used as filters in combination (meaning that having a filter applied on "Slicer Column" doesn't guarantee only 1 row in the table), then rather than testing HASONEFILTER, you can test HASONEVALUE.
ColumnAMeasure = IF(HASONEVALUE(Sheet1[COLUMN A]),MAX(Sheet1[COLUMN A]), "")
ColumnBMeasure = IF(HASONEVALUE(Sheet1[Column B]),MAX(Sheet1[COLUMN B]), "")
Notice that HASONEVALUE tests the current column you're trying to display, rather than a slicer column like HASONEFILTER.
One side-effect of HASONEVALUE is that, if you're filtered to 3 rows, but all 3 rows have the same value for column A, then column A will display that value. (Whereas with HASONEFILTER, column A would stay blank until you're filtered to one thing.)
Low Tech
Both answers above depend on a measure existing for every column you want to display, so that you can test whether to display a blank row or not. That could become a pain if you have dozens of columns.
A lower-tech alternative is to add in an additional row with blanks for each column and then sort your table so that that row always appears first. (And shorten your visual so only the top row is visible.) Technically the other rows would be underneath and there'd be a scrollbar, but at least the initial display would be blank rather than showing a random row.
Hopefully something here has helped. Other people might have better solutions too. More information:
HASONEFILTER documentation: https://msdn.microsoft.com/en-us/library/gg492135.aspx
HASONEVALUE documentation: https://msdn.microsoft.com/en-us/library/gg492190.aspx