Forum Discussion

JS23's avatar
JS23
Frequent Visitor
7 months ago

Blank value in button slicer

Hi all,

 

I have a semantic model (storage mode direct lake on onelake) in Fabric.

I have a pbi report connected to it. The model is as follows:

dim_Customer

fact_Contract

fact_Invoice

Customer is connected to both fact tables using the Customer_ID. Customer has a B2B/B2C field. The field is never blank.

When I drop the field on a button slicer (the 'new slicer' visual), a third (blank) value appears. I know about the blank row, and how it appears when you have missing mappings, or so-called 'invalid' relationships. The blank row is actually 'created' by the model, and not natively present in my customer table. I know that because, when I remove the relationships, the blank value disappears. Nevertheless, I am a 100% convinced there is no mismapping...proof is the DAX query that returns zero rows for either fact table (see screenshot). When I drop the field in a table or matrix visual, the blank row does not show (but that could be default behaviour), but when I drop it in a button slicer it does. Any explenation for this? I know I can filter the slicer, but I want my model to be clean and this drives me pretty nuts 😉

Thx in advance for your appreciated support.

 

 

10 Replies

  • It is called "Referential Integtrity", you have Primary Key fields in your fact table that are not available in your Dim table. Even if dim_Customer[B2B/B2C] has no blanks, Power BI will create a blank/unknown row on the dimension side when any fact row can’t be matched to a customer.

     

    The best fix here would be correcting your Dim table, but if you cant you can enable the option below which would force the relationship work as INNER JOIN instead LEFT JOIN.

     

     

  • Hi JS23 

    What you’re seeing is actually the expected behavior, and the explanation is already implicit in your description.

    If a (Blank) value appears in a slicer that is based on a dimension column, it means that from the model’s perspective there are fact rows that do not successfully resolve to a value in that dimension at query time. There is no other logical mechanism in the engine that creates a blank member “out of thin air”.

    This does not require:

    a physically blank value in dim_Customer

    or an obviously broken relationship

    It does require:

    fact rows whose Customer_ID cannot be matched to dim_Customer in the current evaluation context (orphaned fact rows, late-arriving dimensions, deleted customers, subtle key issues, etc.).

    Why this is confusing:

    Tables and matrices often suppress the blank row by default.

    The new button slicer explicitly exposes the full logical domain of the column, including the auto-generated blank member created by the model.

    In Direct Lake / Fabric this is especially visible, because the engine evaluates relationships very strictly and directly against the data.

    The fact that a DAX query starting from the dimension returns zero rows does not disprove this — slicers are driven by the fact-side domain, not by VALUES(dim[Column]).

    If (Blank) appears in the slicer, there are fact rows that do not map to the dimension. There isn’t another explanation.

    If you want help locating them, you can identify the mismatches explicitly (e.g. fact keys not present in the dimension), or share a repro/model and someone can help pinpoint the exact rows.

    If this post helps, then please consider Accepting it as the solution to help the other members find it more quickly

  • Hi JS23 

     

    It is an expected behavior and not a data issue. Power BI creates an internal unknown (blank) member on dimension side whenever a table is related to fact tables. New button slicer shows the full domain (including this hidden blank) while tables/matrices suppress it by default even when there are no rows

    Create a clean slicer column and use it in the slicer

    Customer Type (Clean) = IF( ISBLANK(dim_Customer[B2B/B2C]), BLANK(), dim_Customer[B2B/B2C] )

     

    Also, if valid for the model enable Assume Referential Integrity on the relationship.

  • Hi  JS23,

    You can do below:

    1.Remove Blank Using visual-level filters
    2.Replace Blank with a Label (“Unknown”, “Not Assigned”)

    CategoryNameFiltered =
    IF (
        ISBLANK ( 'Category'[CategoryName] ),
        "Unknown",
        'Category'[CategoryName]
    )



    Please let me know if you have any further questions or need clarifications.

     

    If this reply helped solve your problem, please consider clicking "Accept as Solution" so others can benefit too. And if you found it useful, a quick "Kudos" is always appreciated, thanks! 

     

    Best Regards, 

    Maruthi 

    LinkedIn - http://www.linkedin.com/in/maruthi-siva-prasad/ 

    X            -  Maruthi Siva Prasad - (@MaruthiSP) / X

    • JS23's avatar
      JS23
      Frequent Visitor

      That would not sovle my issue, at least, I would be hiding future missing values like that

  • JS23 please check if any of the fact tables has at least one record with CustomerId different than the B2B or B2C values that are present in the dim Customer table.

  • Hi JS23 

    Two possible causes are: the related column on the many side of the relationship contains blank values, or there are values on the many side that do not exist in the dimension table. For example, the date table may only include dates for 2025, while the fact table contains rows with missing dates or dates outside of 2025.

    • JS23's avatar
      JS23
      Frequent Visitor

      Hi,

      unfortunately neither of them is true. If that were the case, the dax query I shared in the screenshots would contain a number on the row with the blank value, right?
      When I imported the tables locally into PBI, and then recreated the semantic model, all was fine. So the conclusion is this is related to the storage mode. This is MS Servicedesk explenation:
      Basically they say it's related to the way slicers work together with directlake models. Their suggested solution is to use referential integrity, but I disagree that this is a solution, as it will hide potential mapping issues in the future.

      Below their answer:

      Analysis and Resolution:   

      • You contacted Microsoft Power BI Support request for the issue where Blank value appears in slicer.
      • You agreed on the same note and confirmed to close this ticket as you do not have any further questions/concerns.
      • We initially joined over the screen call and discussed the issue as below.

      After discussing the issue with my internal SMEs, they have shared the following information based on initial investigation.
       

      This behavior is caused by how Direct Lake semantic models materialize metadata for slicer visuals.

      In Direct Lake mode, the engine may internally surface an implicit blank member during slicer enumeration. This blank value:

      • Does not necessarily correspond to an actual blank or unmapped row in the data
      • Does not appear in DAX anti‑joins or relationship validation queries
      • Can be introduced due to how OneLake / Delta metadata, string normalization, or internal relationship evaluation is handled at query time

      Additionally, Button Slicers fully enumerate dimension members and are more likely to surface such internal blank members compared to dropdown slicers.

      This behavior is specific to Direct Lake models and does not typically occur in Import (VertiPaq) models.

       

      As per the details provided by them, I can coincidence the same with the issue you have experienced.

       

      When in import mode we do not see any blanks appear in the Slicer Visuals.

      Also below is a Microsoft community post similar to the issue and they have suggested to Select the referential integrity button when creating the relationship.
       

      Solved: (Blank) in slicer - Microsoft Fabric Community

      Assume Referential Integrity Setting in Power BI Desktop - Power BI | Microsoft Learn

       

      • We followed up on the suggestions and you mentioned the workaround is not so ideal for your scenario and since it is an expected behaviour you gave closure confirmation on the same.
  • Thankyou, Ritaf1983krishnakanth240maruthisppcoleycengizhanarslan and danextian for your responses.

    Hi JS23,

    We appreciate your efforts in sharing the details of the Support team discussion, which will be beneficial to other members of the community. As mentioned by them, at present, this is the expected behavior.

    Please continue to utilise the Microsoft Fabric community for any further queries.

    Thank you.

  • JS23's avatar
    JS23
    Frequent Visitor

    All of these answers refer to the expected behaviour of blank row being created by the semantic model in case where we have a key value on the fact table that is missing on the dim table. I understand that, it's the basic 'blank row' concept. But if that were the case, then I should see at least one row being counted for the blank value (see screenshot).

    Conclusion: there is no missing value on the dim side...all is properly mapped? Do you agree.
    Things get even more interesting: I just connected a blank PBI report to the same warehouse tables, imported them, and recreated the semantic model locally. And the blank row is no longer there. So this leads me to believe that the issue lies within the storage mode (direct lake on Onelake)?