How to count rows in a column, per period, and per category, then rank them, in Power BI using DAX? - powerbi

Below is an example of what I am trying to do.
I have the first two columns in the Table and want to add column three and four.
Is there a DAX way to do this?
I've tried GROUPBY, SUMMARIZE and RANX but can't seem to work it out.
period
animal
count_animal_per_period
rank_animal_per_period
Period 1
cat
4
1
Period 1
cat
4
1
Period 1
dog
2
2
Period 1
cat
4
1
Period 1
dog
2
2
Period 1
bird
1
3
Period 1
cat
4
1
Period 2
dog
4
1
Period 2
dog
4
1
Period 2
dog
4
1
Period 2
cat
2
2
Period 2
cat
2
2
Period 2
bird
1
3
Period 2
dog
4
1
Period 3
cat
4
1
Period 3
bird
2
2
Period 3
cat
4
1
Period 3
cat
4
1
Period 3
dog
1
3
Period 3
bird
2
2
Period 3
cat
4
1

Two calculation:
Count_animal_per_periods =
var __count = CALCULATE( COUNTROWS('Sheet2 (2)'), FILTER(ALL('Sheet2 (2)'[animal],'Sheet2 (2)'[period]), 'Sheet2 (2)'[animal] = SELECTEDVALUE('Sheet2 (2)'[animal]) && 'Sheet2 (2)'[period] = SELECTEDVALUE('Sheet2 (2)'[period])))
return
__count
And second:
rank_animal = RANKX (
FILTER(
ALL(
'Sheet2 (2)'[period],
'Sheet2 (2)'[animal]
),
'Sheet2 (2)'[period] = MAX('Sheet2 (2)'[period])
),
[Count_animal_per_periods]
)

Related

Sum of Value by Category and Status Power BI

I am Attempting to get a sum of ppl that is based on the status of the offer
here is an example of the data
Acc
PPL
Offer comp
ABCDE
1
1
ABCDE
1
0
ABCDE
1
0
CDEFG
2
0
DEFGH
1
1
DEFGH
1
0
DEFGH
1
0
DEFGH
1
1
EFGHI
2
1
EFGHI
2
1
EFGHI
2
0
And this is what I am wanting to achieve as a column either in Power query or Dax
Account
PPL
Offer Comp
total
ABCDE
1
1
1
ABCDE
1
0
1
ABCDE
1
0
1
ABCDE
1
0
1
BCDEF
1
0
1
BCDEF
1
0
1
CDEFG
2
0
2
DEFGH
1
1
2
DEFGH
1
0
2
DEFGH
1
0
2
DEFGH
1
1
2
EFGHI
2
1
4
EFGHI
2
1
4
EFGHI
2
0
4
Basically, we are looking for a count of ppl where if the offer is not completed, we count the ppl, if the offer is accepted, we count the ppl for each acceptance.
Hope this makes sense I would then use this column to create measures as they want ppl count to be unique unless they accepted multiple offers on same account.
I tried to create with selected values and all except but I just couldn't get it to work.
I am probably completely overthinking this.
Very cryptic, and I must admit the sample data and your description is not great, but I think you are after something like this:
Total =
VAR _offer =
SUMX (
ALLEXCEPT (
'Table' ,
'Table'[Account]
) ,
'Table'[Offer Comp] * 'Table'[PPL]
)
RETURN
IF (
_offer > 0 ,
_offer ,
CALCULATE (
MAX ( 'Table'[PPL] ) ,
ALLEXCEPT (
'Table' ,
'Table'[Account]
)
)
)
I have figured it out with help from Marcus
thank you. I realised also need to add a date grouping.
here is the code
Total =
VAR _offer =
CALCULATE(SUM(Table[Offer Comp]),
ALLEXCEPT(Table, Table [Account], Table[Date]))
VAR Pax =
CALCULATE(MAX(Table[PPL]),
ALLEXCEPT(Table, Table[Account]))
RETURN
IF(_offer = 0,
Pax *1,
pax*_offer
)

Power BI DAX - Grouping rows when a value is found in row

I have the below table. I need to group them base on product and increment group number when set = 1 but returns back to 1 if new product is in next line. I have created an index already.
Index
Product
Set
1
Table
0
2
Table
0
3
Table
1
4
Table
0
5
Table
0
6
Table
1
7
Table
0
8
Table
1
9
Chair
0
10
Chair
0
11
Chair
0
12
Chair
1
13
Chair
0
14
Chair
0
15
Chair
1
Here's the result I'm after:
Index
Product
Set
Group
1
Table
0
1
2
Table
0
1
3
Table
1
1
4
Table
0
2
5
Table
0
2
6
Table
1
2
7
Table
0
3
8
Table
1
3
9
Chair
0
1
10
Chair
0
1
11
Chair
0
1
12
Chair
1
1
13
Chair
0
2
14
Chair
0
2
15
Chair
1
2
With this
Grouping=
RANKX (
FILTER (
'fact',
'fact'[Set] <> 0
&& EARLIER ( 'fact'[Product] ) = 'fact'[Product]
),
'fact'[Index],
,
ASC

create a countif measure not impacted by filter in visual in powerBI

Need help in creating measures that will reflect the actual count of rows in the table when filtered.
Example:
ID
RankC
RankA
Avg Diff
RankC_count
RankA_count
Avg Diff_count
1000
AAA
XYZ
+01.00 to +01.25
5
6
4
1001
AAA
ZY1
+01.5.00 to +01.75
5
1
5
1002
AAB
XYZ
+01.5.00 to +01.75
3
6
5
1003
AAB
ZY2
+01.5.00 to +01.75
3
1
5
1004
AAB
XYZ
+01.00 to +01.25
3
6
4
1005
AAA
XYZ
+01.00 to +01.25
5
6
4
1006
AAA
ZY3
+01.00 to +01.25
5
1
4
1007
AAC
XYZ
+01.25.00 to +01.5
1
6
2
1008
AAA
ZY4
+01.25.00 to +01.5
5
2
2
1009
AAZ
ZY4
+01.5.00 to +01.75
1
2
5
1010
ABY
XYZ
+01.5.00 to +01.75
1
6
5
The last 3 columns represent the count of each entry. If I use the measure such as below, it provides the correct count. However, when I use in the visual, filtering by ID, say ID 1000, I want it to show line 1 with 5,6, and 4 on the counts, instead of all 1.
Questions:
Is there any measure to give me the correct result? say summarize the table first then do a lookup?
is creating a column the only choice? I cannot create columns since I need 1000 of these calculated columns. whereas using measure, I can create 1000 in one go.
Thanks for any help.
AverageDiff_Count =
CALCULATE (
COUNTROWS (
FILTER ( '28Jun_1973', [Average Diff] = '28Jun_1973'[Average Diff] )
)
)
The ALL function is useful here. It removes filter context so that it uses the whole table instead of just the part in the current filter context.
AvgDiff_Count =
VAR CurrAvgDiff = SELECTEDVALUE ( '28Jun_1973'[Avg Diff] )
RETURN
COUNTROWS (
FILTER ( ALL ( '28Jun_1973' ), '28Jun_1973'[Avg Diff] = CurrAvgDiff )
)

Amazon Athena: Query to find out patients with compliance=0 for consecutive 10 days

Find all patients having compliance=0 from past consecutive 10 days from current date using Amazon Athena.
patient id compliance create_date
1 0 2021-01-01
1 0 2021-01-02
1 0 2021-01-03
1 0 2021-01-04--rejected not for consecutive 10
2 0 2021-01-01
2 0 2021-01-02
2 0 2021-01-03
2 0 2021-01-04
2 0 2021-01-05
2 0 2021-01-06
2 0 2021-01-07
2 0 2021-01-08
2 0 2021-01-09
2 0 2021-01-10-- accepted as for 10 consective
There are multiple ways to achieve this, and one can be to take the difference between a given date and the next one and check the cumulative sum of last X deltas (which is equal to 10 in your case) and the cumulative sum of your compliance integer on that row (which should be strictly equal to 0):
with base as (
select
*,
sum(delta) over (partition by patient_id rows between 10 preceding and current row) as cumdelta ,
sum(compliance) over (partition by patient_id rows between 10 preceding and current row) as cumcompliance
from (
select *, if (date_diff('day', date, next_date) is null, 1, date_diff('day', date, next_date)) as delta
from (
select
patient_id,
compliance,
try_cast(date as date) as date,
lead(date) over (partition by patient_id order by date) as next_date
from data
)
)
)
select
patient_id,
compliance,
date,
case when (cumdelta = 10 and cumcompliance = 0) then 'yes' else null end as validated_compliance
from base

Putting same income for same groupID

In my data, income was asked only to one person of the group.
householdID memberID income
1 1 4
2 2 .
1 2 .
2 3 .
2 1 3
But obviously, I need to fill them up like
householdID memberID income
1 1 4
2 2 3
1 2 4
2 3 3
2 1 3
How can I do this in Stata?
This is an elementary application of by:
bysort householdID (income) : replace income = income[1] if missing(income)
See for related material this FAQ
A more circumspect approach would check that at most one non-missing value has been supplied for each household:
bysort householdID (income) : gen OK = missing(income) | (income == income[1])
list if !OK