Show Attributes That Have No Measures - SPARSE

The SPARSE function allows you to show dimension column values for which there is no fact data. SPARSE is a middle tier function which enables it to be used with OUTER JOINS and to be used at the database level.

SPARSE works with multiple dimensions in a query. The middle tier does multiple queries to ensure all sparse entries are filled with nulls.

The basic syntax for SPARSE is:

SPARSE([dimension])

Consider the following logical query:

SELECT USING OUTER JOIN [Products.ProductName] 'F8',[OrderDate: Sum: Quantity] 'F1',[Time.Year/Quarter],SPARSE([Time.Year/Quarter]) 'F5' FROM [ALL] WHERE ([Products.ProductName]=Longlife Tofu OR [Products.ProductName]=Chocolade) AND [Time.Year/Quarter]>=1993 AND [Time.Year/Quarter]<=1997 ORDER BY [Time.Year/Quarter]  ASC

As shown in the report below, it is filling in the extra [Time.Year/Quarter] values. Since this is done in the logical layer, this will work with as many SPARSE columns as needed.

Under the covers, Birst is issuing two queries:

SELECT DW_DM_PRODUCTS_PRODUCTS2_.ProductName$ AS 'F8',SUM(CAST(DW_SF_CATEGORIES_DAY_EMPLOYEES_ORDER_DETAILS_PRODUCTS0_.Quantity$ AS BIGINT)) AS 'F1',DW_DM_TIME_DAY1_.Year_Quarter$ AS 'Year/Quarter'

FROM S_N9c6c0cea_3793_415f_8c4b_dad108aaed87.DW_SF_CATEGORIES_DAY_EMPLOYEES_ORDER_DETAILS_PRODUCTS DW_SF_CATEGORIES_DAY_EMPLOYEES_ORDER_DETAILS_PRODUCTS0_

INNER JOIN dbo.DW_DM_TIME_DAY DW_DM_TIME_DAY1_ ON DW_SF_CATEGORIES_DAY_EMPLOYEES_ORDER_DETAILS_PRODUCTS0_.Time$OrderDate_Day_ID$=DW_DM_TIME_DAY1_.Day_ID$

INNER JOIN S_N9c6c0cea_3793_415f_8c4b_dad108aaed87.DW_DM_PRODUCTS_PRODUCTS DW_DM_PRODUCTS_PRODUCTS2_ ON DW_SF_CATEGORIES_DAY_EMPLOYEES_ORDER_DETAILS_PRODUCTS0_.Products$Products1249892458$=DW_DM_PRODUCTS_PRODUCTS2_.Products1249892458$

WHERE ((DW_DM_PRODUCTS_PRODUCTS2_.ProductName$='Longlife Tofu' OR DW_DM_PRODUCTS_PRODUCTS2_.ProductName$='Chocolade') AND DW_DM_TIME_DAY1_.Year_Quarter$>='1993' AND DW_DM_TIME_DAY1_.Year_Quarter$<='1997')

GROUP BY DW_DM_PRODUCTS_PRODUCTS2_.ProductName$,DW_DM_TIME_DAY1_.Year_Quarter$,DW_DM_TIME_DAY1_.Quarter_ID$

ORDER BY DW_DM_TIME_DAY1_.Year_Quarter$ ASC

And

SELECT DW_DM_TIME_QUARTER0_.Year_Quarter$ AS 'Year/Quarter'

FROM dbo.DW_DM_TIME_QUARTER DW_DM_TIME_QUARTER0_

WHERE (DW_DM_TIME_QUARTER0_.Year_Quarter$>='1993' AND DW_DM_TIME_QUARTER0_.Year_Quarter$<='1997')

The second query that returns the values of [Time.Year/Quarter] is filtered. This query extracts from the parent query any filters that apply only to that dimension, reducing result set sizes.

See Also
BQL Quick Reference
BQL Basics