Forum Discussion
SQL to DAX conversion
- 4 years ago
Happy New Year, pal! Thanks for tagging me for some tricky game of DAX.
I'm afraid you were mislead by PO's sql; first of all, I simplied it this way,
declare @Transdate datetime declare @warehouse nvarchar(225) declare @province nvarchar(225) set @Transdate = '2016-07-11 00:00:00.000' set @province = 'BC' set @warehouse = 'BC-52' ; with main1 as ( SELECT * , ROW_NUMBER() OVER(Partition by itemid ORDER BY transdate DESC) AS [rn] , SUM([Amount]) OVER (PARTITION BY ItemID) AS [Total] FROM [dbo].[MATDW SAMPLE DATA] dt WHERE transdate <= @Transdate and province = @province and warehouseid = @warehouse) select * from main1 where [rn]=1DAX
Total = VAR __cat = MAX( 'MATDW SAMPLE DATA'[Category] ) VAR __summary = CALCULATETABLE( ADDCOLUMNS( ADDCOLUMNS( SUMMARIZE( 'MATDW SAMPLE DATA', 'MATDW SAMPLE DATA'[ITEMID], 'MATDW SAMPLE DATA'[WarehouseID] ), "@amt", CALCULATE( SUM( 'MATDW SAMPLE DATA'[Amount] ) ), "@maxdate", CALCULATE( MAX( 'MATDW SAMPLE DATA'[TRANSDATE] ) ) ), "@Cat", VAR __dt = [@maxdate] RETURN CALCULATE( MAX( 'MATDW SAMPLE DATA'[Category] ), 'MATDW SAMPLE DATA'[TRANSDATE] = __dt ) ), ALLSELECTED( 'MATDW SAMPLE DATA'[Category] ) ) RETURN IF( __cat IN SELECTCOLUMNS( __summary, "_cat", [@Cat] ), SUMX( FILTER( __summary, [@Cat] = __cat ), [@amt] ) )
amikm can you provide a SQL DDL? or at least provide a sizeable sample of [InventoryBalancedet_2] in a pbix, upload that in a g drive/1 drive and share the link here?
Thanks smpa01 , Please find the sample data and file
i have attached a zip file containing the zip file & the sql query .
i will like to get the results (Amount by category) as shown in the query .
Also i will like to use the filters below on the result set
1) transdate
2) warehouse
3) province
https://drive.google.com/drive/folders/1z0OsSNTsOk2_j-AtD0IV9eDa0_P-zMo4?usp=sharing
- smpa014 years agoCommunity Champion
amikm I deleted my earlier answer cause I realized it was wrong.
I spent some time with this but could not make it to work, looping parry2k AlexisOlson CNENFRNL
parry2k AlexisOlson CNENFRNL OP has a TSQL query like following
declare @Transdate datetime declare @warehouse nvarchar(225) declare @province nvarchar(225) set @Transdate = '2016-07-11 00:00:00.000' set @province = 'BC' set @warehouse = 'BC-52' ----- THIS CTE RANKS THE ITEMS TO GET THE MOST RECENT category ----------- ;with main1 as ( SELECT * , ROW_NUMBER() OVER(Partition by itemid, warehouseid ORDER BY transdate DESC) AS rn FROM [newtest].[dbo].[MATDW SAMPLE DATA] dt WHERE transdate <= @Transdate and province = @province and warehouseid = @warehouse ) ,main2 as ( select sum(Amount) as AMOUNT , ItemID ,warehouseid FROM [newtest].[dbo].[MATDW SAMPLE DATA] WHERE transdate <= @Transdate and province = @province and warehouseid = @warehouse group by ItemID , warehouseid ) ,main3 as ( SELECT m2.AMOUNT, m2.warehouseid , m1.Category FROM main1 m1 inner join main2 m2 on m1.warehouseid = m2.warehouseid and m1.ItemID = m2.ItemID and m1.rn = 1 ) ,main4 as (select sum(m3.AMOUNT) AS AMOUNT ,m3.Category FROM main3 m3 group by m3.Category ) select * from main3 /*where rn=1*/ --select * --FROM [newtest].[dbo].[MATDW SAMPLE DATA] --WHERE transdate <= @Transdate --and province = @province --and warehouseid = @warehouse and ITEMID=10000which produces this
The equivalent DAX query for a dervied table would be following
Table = VAR _basicFilterDate = DATE ( 2016, 7, 11 ) VAR _basicFilterProvince = "BC" VAR _basicFilterWarehouse = "BC-52" VAR _filteredTable = FILTER ( 'MATDW SAMPLE DATA', 'MATDW SAMPLE DATA'[Province] = _basicFilterProvince && 'MATDW SAMPLE DATA'[TRANSDATE] <= _basicFilterDate && 'MATDW SAMPLE DATA'[WarehouseID] = _basicFilterWarehouse ) var _sum = ADDCOLUMNS(_filteredTable,"sum",SUMX(FILTER(_filteredTable,[ITEMID]=EARLIER([ITEMID])&&[WarehouseID]=EARLIER([WarehouseID])),[Amount])) var _date = ADDCOLUMNS(_sum,"maxDT",MAXX(FILTER(_sum,[ITEMID]=EARLIER([ITEMID])&&[WarehouseID]=EARLIER([WarehouseID])),[TRANSDATE])) var _filter = FILTER(_date,[TRANSDATE]=[maxDT]) var _groupBY = SUMMARIZE(_filter,[Category],[sum]) var _aggregation = GROUPBY(_groupBY,[Category],"_sum",SUMX(CURRENTGROUP(),[sum])) RETURN _aggregationwhich returns this
However, how can this be converted to measure that reponses to a slicer
VAR _basicFilterDate = DATE ( 2016, 7, 11 ) VAR _basicFilterProvince = "BC" VAR _basicFilterWarehouse = "BC-52"Created a pbix for your convenience as it has bothered me for a while.
- CNENFRNL4 years agoCommunity Champion
Happy New Year, pal! Thanks for tagging me for some tricky game of DAX.
I'm afraid you were mislead by PO's sql; first of all, I simplied it this way,
declare @Transdate datetime declare @warehouse nvarchar(225) declare @province nvarchar(225) set @Transdate = '2016-07-11 00:00:00.000' set @province = 'BC' set @warehouse = 'BC-52' ; with main1 as ( SELECT * , ROW_NUMBER() OVER(Partition by itemid ORDER BY transdate DESC) AS [rn] , SUM([Amount]) OVER (PARTITION BY ItemID) AS [Total] FROM [dbo].[MATDW SAMPLE DATA] dt WHERE transdate <= @Transdate and province = @province and warehouseid = @warehouse) select * from main1 where [rn]=1DAX
Total = VAR __cat = MAX( 'MATDW SAMPLE DATA'[Category] ) VAR __summary = CALCULATETABLE( ADDCOLUMNS( ADDCOLUMNS( SUMMARIZE( 'MATDW SAMPLE DATA', 'MATDW SAMPLE DATA'[ITEMID], 'MATDW SAMPLE DATA'[WarehouseID] ), "@amt", CALCULATE( SUM( 'MATDW SAMPLE DATA'[Amount] ) ), "@maxdate", CALCULATE( MAX( 'MATDW SAMPLE DATA'[TRANSDATE] ) ) ), "@Cat", VAR __dt = [@maxdate] RETURN CALCULATE( MAX( 'MATDW SAMPLE DATA'[Category] ), 'MATDW SAMPLE DATA'[TRANSDATE] = __dt ) ), ALLSELECTED( 'MATDW SAMPLE DATA'[Category] ) ) RETURN IF( __cat IN SELECTCOLUMNS( __summary, "_cat", [@Cat] ), SUMX( FILTER( __summary, [@Cat] = __cat ), [@amt] ) )