Pivot Financial Dimensions into a single Record
6. October 2020 Leave a comment
At work we had the requirement to provide a SQL view of PurchLine Records including their financial dimensions. However, since Dynamics AX the financial dimension data model has been enhanced to be more flexible. In contrast to older versions where Dynamics AX 2009 supported by default 3 dimensions, you are now free to configure as much as you want.

The tables involved are the DimensionAttributeValueSet, DimensionAttributeValueSetItem, DimensionAttributeValue and the DimensionAttribute. The following statement collects the financial dimension values from the image above (RecID for the set is 52565498264).
select DIMENSIONATTRIBUTEVALUESET.RECID as DIM_ID, DIMENSIONATTRIBUTE.NAME as DIM_NAME, DIMENSIONATTRIBUTEVALUESETITEM.DISPLAYVALUE as DIM_VALUE from DIMENSIONATTRIBUTEVALUESET join DIMENSIONATTRIBUTEVALUESETITEM on DIMENSIONATTRIBUTEVALUESET.RecId = DIMENSIONATTRIBUTEVALUESETITEM.DIMENSIONATTRIBUTEVALUESET join DIMENSIONATTRIBUTEVALUE on DIMENSIONATTRIBUTEVALUESETITEM.DIMENSIONATTRIBUTEVALUE = DIMENSIONATTRIBUTEVALUE.RECID join DIMENSIONATTRIBUTE on DIMENSIONATTRIBUTEVALUE.DIMENSIONATTRIBUTE = DIMENSIONATTRIBUTE.RECID where DIMENSIONATTRIBUTEVALUESET.RECID = 52565498264
The result looks like this:

The PIVOT is used to switch row values into columns. The following statement creates a single record with columns for the dimensions:
SELECT * FROM ( select DIMENSIONATTRIBUTE.NAME as DIM_NAME, DIMENSIONATTRIBUTEVALUESETITEM.DISPLAYVALUE as DIM_VALUE from DIMENSIONATTRIBUTEVALUESET join DIMENSIONATTRIBUTEVALUESETITEM on DIMENSIONATTRIBUTEVALUESET.RecId = DIMENSIONATTRIBUTEVALUESETITEM.DIMENSIONATTRIBUTEVALUESET join DIMENSIONATTRIBUTEVALUE on DIMENSIONATTRIBUTEVALUESETITEM.DIMENSIONATTRIBUTEVALUE = DIMENSIONATTRIBUTEVALUE.RECID join DIMENSIONATTRIBUTE on DIMENSIONATTRIBUTEVALUE.DIMENSIONATTRIBUTE = DIMENSIONATTRIBUTE.RECID where DIMENSIONATTRIBUTEVALUESET.RECID = 52565498264 ) AS SourceTable PIVOT ( Max(DIM_VALUE) FOR DIM_NAME IN ([Department], [ItemGroup], [CostCenter], [BusinessUnit], [Project]) ) AS PivotTable
The result looks like this:

If some dimensions do not hold values it will be NULL in the SQL but the statement will not fail


In order to join the financial dimension pivot record with the transaction like (e.g. PurchLine) add the RecId from the FinancialDimensionAttributeValueSet and join it on the Dimension reference field from the transaction table. Here is an example:
select
PurchId, ItemId, PURCHQTY, PURCHPRICE,
FinDim.Department, FinDim.ItemGroup, FinDim.CostCenter, FinDim.BusinessUnit, FinDim.Project
from PURCHLINE
left join
(
SELECT * FROM
(
select
DIMENSIONATTRIBUTEVALUESET.RECID as RECID,
DIMENSIONATTRIBUTE.NAME as DIM_NAME,
DIMENSIONATTRIBUTEVALUESETITEM.DISPLAYVALUE as DIM_VALUE
from DIMENSIONATTRIBUTEVALUESET
join DIMENSIONATTRIBUTEVALUESETITEM
on DIMENSIONATTRIBUTEVALUESET.RecId = DIMENSIONATTRIBUTEVALUESETITEM.DIMENSIONATTRIBUTEVALUESET
join DIMENSIONATTRIBUTEVALUE
on DIMENSIONATTRIBUTEVALUESETITEM.DIMENSIONATTRIBUTEVALUE = DIMENSIONATTRIBUTEVALUE.RECID
join DIMENSIONATTRIBUTE
on DIMENSIONATTRIBUTEVALUE.DIMENSIONATTRIBUTE = DIMENSIONATTRIBUTE.RECID
) AS SourceTable
PIVOT
(
Max(DIM_VALUE)
FOR DIM_NAME IN ([Department], [ItemGroup], [CostCenter], [BusinessUnit], [Project])
) AS PivotTable
) as FinDim
on PurchLine.DefaultDimension = FinDim.RecId
where PURCHID = '000081' and DATAAREAID = 'USMF'
The result set are two records, one for each PurchLine, and the corresponding financial dimension values:
