Monday 15 July 2013

SQL to DAX - Sample Queries

Following queries gives an idea how to convert a SQL query to DAX.
Note: In last query WorkingDays represents the total Business days for a given period of time.

/* SELECT * FROM Projects
EVALUATE
(
'Projects'
)
*/

/*SELECT ProjectNames FROM Projects
EVALUATE
(
SUMMARIZE
(
'Projects'
,[ProjectName]
)
)
*/

/* SELECT COUNT(distinct [WorkDate]) AS Holidays
FROM [dbo].[Invoices] (NOLOCK)
WHERE [ProjectId] = 8
EVALUATE
(
ROW("TotalHolidays", COUNTROWS(
FILTER('Invoices',[ProjectId]=8)))
)
*/

/* WITH CTE1 AS (
SELECT [EmpName]
, MIN([WorkDate]) AS StartDate
, MAX([WorkDate]) AS EndDate
FROM [dbo].[Invoices] (NOLOCK)
GROUP BY [EmpName]),

CTE2 AS (
SELECT [EmpName]
, SUM([Hours]) AS BillingHours
FROM [dbo].[Invoices] (NOLOCK)
WHERE [BillingType] = 'Billable'
GROUP BY [EmpName])

SELECT C.EmpName
, C.StartDate
, C.EndDate
, T.BillingHours
, T.BillingHours/((SELECT (DATEDIFF(dd, C.StartDate, C.EndDate) + 1)
-(DATEDIFF(wk, c.StartDate, C.EndDate) * 2)
-(CASE WHEN DATENAME(dw, C.StartDate) = 'Sunday' THEN 1 ELSE 0 END)
-(CASE WHEN DATENAME(dw, C.EndDate) = 'Saturday' THEN 1 ELSE 0 END)
-@Holidays)*8) AS Utilization
FROM CTE1 C
JOIN CTE2 T ON C.EmpName = T.EmpName

*/
DEFINE
MEASURE 'Invoices'[StartDate] = MIN('Invoices'[WorkDate])
MEASURE 'Invoices'[EndDate] = MAX('Invoices'[WorkDate])
MEASURE 'Invoices'[BillingHours] = CALCULATE(SUM('Invoices'[Hours]),'Invoices'[BillingType] = "Billable")
MEASURE 'Invoices'[WorkingDays] = ((1. * (MAX('Invoices'[WorkDate])-MIN('Invoices'[WorkDate])))+1)
-((WEEKNUM(MAX('Invoices'[WorkDate])))-(WEEKNUM(MIN('Invoices'[WorkDate]))))*2
-(IF(WEEKDAY( MIN('Invoices'[WorkDate]))=1,1,0))
-(IF(WeekDAy( MAX('Invoices'[WorkDate]))=7,1,0))
EVALUATE
SUMMARIZE
(
'Invoices'
,[EmpName]
,"StartDate"
,'Invoices'[StartDate]
,"EndDate"
,'Invoices'[EndDate]
,"BillingHours"
,'Invoices'[BillingHours]
,"Utilization"
,'Invoices'[BillingHours]/'Invoices'[WorkingDays]
)







No comments:

Post a Comment