Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Earn the coveted Fabric Analytics Engineer certification. 100% off your exam for a limited time only!

Reply
kattlees
Post Patron
Post Patron

Need help on how to set up database

I am struggling with how to organize the data from the database I can connect to and wondering if someone has any suggestions.  I have attached some sample data

 

The database has 8 columns with answers to form questions. Each answer is it's own line. I need to pivot the table so it is one line with the answers all one one line based on the formcode-seq. The issue I am running into is if a mistake is made on an answer and the person goes back and fixes it, there are two lines with the same answer code and I only need the LAST answer. In the sample data - the code Stop1 has two answers for the same form-seq.
Then the date should be the date from the first entry on that form.

 

1 ACCEPTED SOLUTION

Hi @kattlees ,

this code should do if your data is not too large:

 

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("rdNRa4MwEAfwryI+C96lxuR8dg/tViZzb6UP0gYsrComfv9FNphp52xkL+FIyI/Lkf/hEDIuhYAwCrHo2xPaAmQMFDNACoAyEHbraV9kDAWRrRlKuz6/kBxPxgvF0J/qSqtzoIeu+7goHR6jqazNPl8ll9eLqaNg19bNHVm+ryLzVlmwapQL5pVRD3l040kgu+dafdvdWzxdtIgnrrRt3q7rukrAlV4H8z8tFdWg102KAF2qNCvnhMTZ75SMcfMl4SZDuJUYLD1vmgKEbyrN4IciPtZMTD8W80yBn/xQCvzI5RT4eRLhjxT4WZgizMbAl4LZHPhKCZ8PgndXM9/XnxLMtnX8BA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [customer = _t, code = _t, #"Entry Date Time" = _t, nurse = _t, seq = _t, formcd = _t, formseq = _t, ans = _t]),
    ChangeType = Table.TransformColumnTypes(Source,{{"customer", Int64.Type}, {"code", type text}, {"Entry Date Time", type text}, {"nurse", type text}, {"seq", Int64.Type}, {"formcd", type text}, {"formseq", Int64.Type}, {"ans", type text}}),
    #"Sorted Rows" = Table.Buffer(Table.Sort(ChangeType,{{"Entry Date Time", Order.Descending}})),
    #"Removed Duplicates" = Table.Distinct(#"Sorted Rows", {"customer", "code", "formcd", "formseq"}),
    #"Changed Type with Locale" = Table.TransformColumnTypes(#"Removed Duplicates", {{"Entry Date Time", type datetime}}, "en-US"),
    #"Changed Type1" = Table.TransformColumnTypes(#"Changed Type with Locale",{{"Entry Date Time", type date}}),
    #"Removed Columns" = Table.RemoveColumns(#"Changed Type1",{"Entry Date Time", "nurse", "seq"}),
    #"Pivoted Column" = Table.Pivot(#"Removed Columns", List.Distinct(#"Removed Columns"[code]), "code", "ans"),
    #"Merged Queries" = Table.NestedJoin(#"Pivoted Column", {"customer", "formcd", "formseq"}, #"Changed Type1", {"customer", "formcd", "formseq"}, "Pivoted Column", JoinKind.LeftOuter),
    #"Added Custom" = Table.AddColumn(#"Merged Queries", "Date", each List.Min([Pivoted Column][Entry Date Time])),
    #"Removed Columns1" = Table.RemoveColumns(#"Added Custom",{"Pivoted Column"})
in
    #"Removed Columns1"

 

Imke Feldmann (The BIccountant)

If you liked my solution, please give it a thumbs up. And if I did answer your question, please mark this post as a solution. Thanks!

How to integrate M-code into your solution -- How to get your questions answered quickly -- How to provide sample data -- Check out more PBI- learning resources here -- Performance Tipps for M-queries

View solution in original post

12 REPLIES 12
RobbeVL
Impactful Individual
Impactful Individual

Hi there,

 

Could you please copy your data in here so I can model it for you ?

 

Regards,

 

robbe

Thanks so much. I am open to any ideas.

 

customercodeEntry Date Timenurseseqformcdformseqans
2587701Proc18/9/2019 9:07EMP:21799218KL9871Purchased supplies
2587701stMD18/9/2019 9:07EMP:21799218KL9871Smith, John
2587701stST18/9/2019 9:07EMP:21799218KL9871Doe, Jane
258770Date18/9/2019 9:07EMP:21799219KL9871080919
258770Drop18/9/2019 9:56EMP:21799219KL98710954
258770InRm18/9/2019 9:07EMP:21799219KL98710840
258770Out18/9/2019 9:56EMP:21799219KL98710954
258770Pause18/9/2019 9:07EMP:21799219KL98710901
258770Stop18/9/2019 9:56EMP:21799219KL987101952
258770Stop18/13/2019 13:10EMP:21799220KL98710954
2587701Proc18/10/2019 16:00EMP:21950278KL9872Purchased supplies
2587701stMD18/10/2019 16:00EMP:21950278KL9872Smith, John
2587701stST18/10/2019 16:00EMP:21950278KL9872Doe, Jane
258770Date18/10/2019 16:00EMP:21950278KL9872081019
258770Drop18/10/2019 16:00EMP:21950278KL98721610
258770InRm18/10/2019 16:00EMP:21950278KL98721600
258770Out18/10/2019 16:00EMP:21950278KL98721645
258770Pause18/10/2019 16:00EMP:21950278KL98721602
258770Stop18/10/2019 16:00EMP:21950278KL98721725
RobbeVL
Impactful Individual
Impactful Individual

1 More thing.
How do you identify a mistake correction? --> 2 times the same value in a row?
What is the nurse field? should be taken into account?

 

@ImkeF  Helped me with some advanced M query in the past. If you're lucky she will have a look here! 🙂 

A mistake correction is one with the same form, formseq and code but a different time. 

If I have multiple entries for the same customer with the same form, form seq and code, i always want the value with the LAST entry date time. Would also be a higher seq #.

 

The nurse field doesn't have to be taken into account. There can be multiple ones for the same customer/form seq code unless you can put that value next to the entry so we know what nurse did it.

Hi @kattlees ,

this code should do if your data is not too large:

 

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("rdNRa4MwEAfwryI+C96lxuR8dg/tViZzb6UP0gYsrComfv9FNphp52xkL+FIyI/Lkf/hEDIuhYAwCrHo2xPaAmQMFDNACoAyEHbraV9kDAWRrRlKuz6/kBxPxgvF0J/qSqtzoIeu+7goHR6jqazNPl8ll9eLqaNg19bNHVm+ryLzVlmwapQL5pVRD3l040kgu+dafdvdWzxdtIgnrrRt3q7rukrAlV4H8z8tFdWg102KAF2qNCvnhMTZ75SMcfMl4SZDuJUYLD1vmgKEbyrN4IciPtZMTD8W80yBn/xQCvzI5RT4eRLhjxT4WZgizMbAl4LZHPhKCZ8PgndXM9/XnxLMtnX8BA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [customer = _t, code = _t, #"Entry Date Time" = _t, nurse = _t, seq = _t, formcd = _t, formseq = _t, ans = _t]),
    ChangeType = Table.TransformColumnTypes(Source,{{"customer", Int64.Type}, {"code", type text}, {"Entry Date Time", type text}, {"nurse", type text}, {"seq", Int64.Type}, {"formcd", type text}, {"formseq", Int64.Type}, {"ans", type text}}),
    #"Sorted Rows" = Table.Buffer(Table.Sort(ChangeType,{{"Entry Date Time", Order.Descending}})),
    #"Removed Duplicates" = Table.Distinct(#"Sorted Rows", {"customer", "code", "formcd", "formseq"}),
    #"Changed Type with Locale" = Table.TransformColumnTypes(#"Removed Duplicates", {{"Entry Date Time", type datetime}}, "en-US"),
    #"Changed Type1" = Table.TransformColumnTypes(#"Changed Type with Locale",{{"Entry Date Time", type date}}),
    #"Removed Columns" = Table.RemoveColumns(#"Changed Type1",{"Entry Date Time", "nurse", "seq"}),
    #"Pivoted Column" = Table.Pivot(#"Removed Columns", List.Distinct(#"Removed Columns"[code]), "code", "ans"),
    #"Merged Queries" = Table.NestedJoin(#"Pivoted Column", {"customer", "formcd", "formseq"}, #"Changed Type1", {"customer", "formcd", "formseq"}, "Pivoted Column", JoinKind.LeftOuter),
    #"Added Custom" = Table.AddColumn(#"Merged Queries", "Date", each List.Min([Pivoted Column][Entry Date Time])),
    #"Removed Columns1" = Table.RemoveColumns(#"Added Custom",{"Pivoted Column"})
in
    #"Removed Columns1"

 

Imke Feldmann (The BIccountant)

If you liked my solution, please give it a thumbs up. And if I did answer your question, please mark this post as a solution. Thanks!

How to integrate M-code into your solution -- How to get your questions answered quickly -- How to provide sample data -- Check out more PBI- learning resources here -- Performance Tipps for M-queries

Wow - where do I begin! I have never done the advanced editor before so I am excited to try this.


one big thing is that the entry date and entry time are actually two columns combined nsma1_dt and nsma1_tm. I had merged them in the database prior to getting the data for you so my apologies there.

 

Since i have never done the editor before which part do I change to pull from my actual database? I'm assuming it's the very first part and I change my source to the actual database?

 

Thank you so much for your help!

Hi @kattlees ,

once you've pasted the code into the advanced editor, you can leave it and edit the steps from the UI where needed. You have to edit the first step "Source" to connect to your DB. Please check this video - hopefully it helps: http://community.powerbi.com/t5/Webinars-and-Video-Gallery/Power-BI-Forum-Help-How-to-integrate-M-co...

 

Not sure about your remark about the date and time: Do you need a new code here?

 

Imke Feldmann (The BIccountant)

If you liked my solution, please give it a thumbs up. And if I did answer your question, please mark this post as a solution. Thanks!

How to integrate M-code into your solution -- How to get your questions answered quickly -- How to provide sample data -- Check out more PBI- learning resources here -- Performance Tipps for M-queries

@ImkeF  I was super excited for your code and got it to connect to database and pivot as I wanted. But I just noticed it isn't keeping the last entered record. See attached screenshots when I put it to just one record.

 

When I click on Remove Duplicates - it removed the wrong one. Should always KEEP the one with the higher seq #.

 

screenshot.jpg

Hi @kattlees 

Thats because I've sorted by Entry Date Time and not by that number, sorry about that. So you have to adjust the 3rd step like so:

 

#"Sorted Rows" = Table.Buffer(Table.Sort(ChangeType,{{"nsma1_formsec", Order.Descending}})),

Imke Feldmann (The BIccountant)

If you liked my solution, please give it a thumbs up. And if I did answer your question, please mark this post as a solution. Thanks!

How to integrate M-code into your solution -- How to get your questions answered quickly -- How to provide sample data -- Check out more PBI- learning resources here -- Performance Tipps for M-queries

You have been a huge help so thank you, but one more question. Is there a way to keep the earliest entry date and time for a patnum-form-code as a column?  

Thank you

Thank you for the video. I will watch it right away.

 

As for the date and time - not sure if it matters but in the database, there are TWO Columns.  nsma1_dt and nsma1_tm so the date and time are separated - not a combined field. 

Helpful resources

Announcements
April AMA free

Microsoft Fabric AMA Livestream

Join us Tuesday, April 09, 9:00 – 10:00 AM PST for a live, expert-led Q&A session on all things Microsoft Fabric!

March Fabric Community Update

Fabric Community Update - March 2024

Find out what's new and trending in the Fabric Community.