Forum Discussion
Declaración SQL a DAX
Hola Gurus
Estoy tratando de convertir las siguientes consultas a DAX, las consultas forman parte de un Proc almacenado. :. ¿Hay alguna manera de convertirlas en DAX equivalentes. También hay alguna manera de almacenar en tablas temporales, como las de abajo en PBI?
Gracias de antemano!
--Cargar en la tabla temporal #CURRENT_SRC
1) SELECCIONAR RPT_PRD_END_DT, MTH_CTGRY, BRWR_DSC, WAPD_NUM WAPD_DEN
INTO #CURRENT_SRC
FROM (SELECT RPT_PRD_END_DT, MTH_CTGRY, BRWR_DSC, ROUND(WAPD_NUM ,2) AS WAPD_NUM, ROUND(WAPD_DEN ,2) AS WAPD_DEN
DESDE [INDUSTRY_SUMMARY] AA
DONDE AA. RPT_PRD_END_DT entre EOMONTH('30-APR-2020',-61) y '30-APR-2020') AA
--Cargar en STEP2
2) SELECCIONAR RPT_PRD_END_DT , BRWR_DSC
, CASE WHEN SUM(WAPD_den)-0 THEN NULL ELSE SUM(WAPD_NUM)/ SUM(WAPD_den) END AS WAPD_PCT
en #STEP2 de #CURRENT_SRC donde MTH_CTGRY 'Q'
GRUPO POR RPT_PRD_END_DT, BRWR_RPT_RIC_SMY_DSC
--Compute el promedio ahora, para cada resumen desc:
3) SELECCIONE BRWR_DSC, AVG(WAPD_PCT) como WAPD_PCT
DE GRUPO #STEP2 POR BRWR_DSC
@scheri Ok, pude hacer las dos segundas tablas, pero tienen que ser todas tablas DAX separadas, no en una como yo estaba tratando de hacer.
PASO 2 ?
COLUMNAS DE RESUMEN (
CURRENT_SRC[RPT_PRD_END_DT],
CURRENT_SRC[BRWR_RPT_RIC_SMY_DSC],
FILTRO ( CURRENT_SRC, CURRENT_SRC[MTH_CTGRY] á "M" ),
"WAPD_PCT",
SI (
SUM ( CURRENT_SRC[WAPD_DEN] ) a 0,
BLANK (),
DIVIDE ( SUM ( CURRENT_SRC[WAPD_NUM] ), SUM ( CURRENT_SRC[WAPD_DEN] ) )
)
)AVGTABLE ?
COLUMNAS DE RESUMEN (
STEP2[BRWR_RPT_RIC_SMY_DSC],
"WAPD_PCT", PROMEDIO ( STEP2[WAPD_PCT] )
)Y para @AllisonKennedy, puede que no sea la mejor manera de hacer el trabajo. El objetivo final que está buscando es ese promedio por BRWR_DSC de la WAPD_PCT que RPT_PRD_END_DT da. Esto se puede hacer en una sola medida (utilicé M porque no había Q en la tabla de muestras):
Promedio de WAPD_PCT por BRWR_DSC
AVERAGEX (
VALUES ( CURRENT_SRC[BRWR_RPT_RIC_SMY_DSC] ),
AVERAGEX (
CALCULATETABLE (
VALUES ( CURRENT_SRC[RPT_PRD_END_DT] ),
CURRENT_SRC[MTH_CTGRY] á "M"
),
DIVIDE (
ROUND ( SUM ( CURRENT_SRC[WAPD_NUM] ), 2 ),
ROUND ( SUM ( CURRENT_SRC[WAPD_DEN] ), 2 ),
BLANK ()
)
)
)Por favor, eche un vistazo al PBIX adjunto.
13 Replies
- DataZoe
Microsoft Employee
@scheri He analizado sus consultas a través de http://poorsql.com/ (también hay un plugin para Notepad ++).
SELECT RPT_PRD_END_DT ,MTH_CTGRY ,BRWR_DSC ,WAPD_NUM ,WAPD_DEN INTO #CURRENT_SRC FROM ( SELECT RPT_PRD_END_DT ,MTH_CTGRY ,BRWR_DSC ,ROUND(WAPD_NUM, 2) AS WAPD_NUM ,ROUND(WAPD_DEN, 2) AS WAPD_DEN FROM [INDUSTRY_SUMMARY] AA WHERE AA.RPT_PRD_END_DT BETWEEN EOMONTH('30-APR-2020', - 61) AND '30-APR-2020' ) AA SELECT RPT_PRD_END_DT ,BRWR_DSC ,CASE WHEN SUM(WAPD_den) = 0 THEN NULL ELSE SUM(WAPD_NUM) / SUM(WAPD_den) END AS WAPD_PCT INTO #STEP2 FROM #CURRENT_SRC WHERE MTH_CTGRY = 'Q' GROUP BY RPT_PRD_END_DT ,BRWR_RPT_RIC_SMY_DSC --Compute the Average now, for each summary desc: SELECT BRWR_DSC ,AVG(WAPD_PCT) AS WAPD_PCT FROM #STEP2 GROUP BY BRWR_DSClo que lo hace un poco más legible 🙂
Para sus preguntas sobre tablas temporales, sí, puede crear tablas con expresiones DAX mediante https://docs.microsoft.com/en-us/dax/summarize-function-dax RESUME y SUMMARIZECOLUMNS https://docs.microsoft.com/en-us/dax/summarizecolumns-function-dax para nombrar las expresiones DAX más utilizadas en https://docs.microsoft.com/en-us/dax/table-manipulation-functions-dax .
Por ejemplo, aquí está su primera tabla:
COLUMNAS DE RESUMEN (
'INDUSTRY_SUMMARY'[RPT_PRD_END_DT],
'INDUSTRY_SUMMARY'[MTH_CTGRY],
'INDUSTRY_SUMMARY'[BRWR_DSC],
FILTRO (
'INDUSTRY_SUMMARY',
FECHAS ENTRE LAS FECHAS (
'INDUSTRY_SUMMARY'[RPT_PRD_END_DT],
EOMONTH ( FECHA ( 2020, 4, 30 ), - 61 ),
FECHA ( 2020, 4, 30 )
)
),
"WAPD_NUM", ROUND ( SUM ( 'INDUSTRY_SUMMARY'[WAPD_NUM] ), 2 ),
"WAPD_DEN", ROUND ( SUM ( 'INDUSTRY_SUMMARY'[WAPD_DEN] ), 2 )
)Editar: Aquí está todo, lo agregaría como una tabla DAX:
THEDAXVERSION ?
Fue CURRENT_SRC =
RESumaIRCOLUMNS (
'INDUSTRY_SumaMARY'[RPT_PRD_END_DT],
'INDUSTRY_SUMMARY'[MTH_CTGRY],
'INDUSTRY_SUMMARY'[BRWR_DSC],
Filtro (
'INDUSTRY_SUMMARY',
FECHAS ENTRE (
'INDUSTRY_SUMMARY'[RPT_PRD_END_DT],
EOMONTH ( Fecha ( 2020, 4, 30 ), - 61 ),
Fecha ( 2020, 4, 30 )
)
),
"WAPD_NUM", Redondo ( SUM ( 'INDUSTRY_SUMMARY'[WAPD_NUM] ), 2 ),
"WAPD_DEN", Redondo ( SUM ( 'INDUSTRY_SUMMARY'[WAPD_DEN] ), 2 )
)
Fue Step2 =
RESUMIRCOLUMNS (
CURRENT_SRC[RPT_PRD_END_DT],
CURRENT_SRC[BRWR_DSC],
Filtro ( CURRENT_SRC, CURRENT_SRC[MTH_CTGRY] "P" ),
"WAPD_PCT",
Si (
CURRENT_SRC[WAPD_DEN] 0,
Blanco (),
Dividir ( CURRENT_SRC[WAPD_NUM], CURRENT_SRC[WAPD_DEN] )
)
)
Fue AVGTABLE =
RESUMIRCOLUMNS ( Step2[BRWR_DSC], "WAPD_PCT", Promedio ( Step2[WAPD_PCT] ) )
devolución
AVGTABLE- AnonymousNot applicable
Gracias @DataZoe. Estoy recibiendo un error de sintaxis, cuando intenté la primera parte creando la tabla:. ¿Necesita una parte RETURN? (Todo el recuento ( y ).
La sintaxis de ')' es incorrecta. (DAX(VAR current_src........
Esta es la tabla DAX que intento crear (igual, tienen un nombre de tabla diferente):
CURRENT_SOURCE VAR current_src
COLUMNAS DE RESUMEN (
'ENT_RSKRECESSION_INDUSTRY_SUMMARY'[RPT_PRD_END_DT],
'ENT_RSKRECESSION_INDUSTRY_SUMMARY'[MTH_CTGRY],
'ENT_RSKRECESSION_INDUSTRY_SUMMARY'[BRWR_RPT_RIC_SMY_DSC],
FILTRO (
'ENT_RSKRECESSION_INDUSTRY_SUMMARY',
FECHAS ENTRE LAS FECHAS (
'ENT_RSKRECESSION_INDUSTRY_SUMMARY'[RPT_PRD_END_DT],
EOMONTH ( FECHA ( 2020, 4, 30 ), - 61 ),
FECHA ( 2020, 4, 30 )
)
),
"WAPD_NUM", ROUND ( SUM ( 'ENT_RSKRECESSION_INDUSTRY_SUMMARY'[WAPD_NUM] ), 2 ),
"WAPD_DEN", ROUND ( SUM ( 'ENT_RSKRECESSION_INDUSTRY_SUMMARY'[WAPD_DEN] ), 2 )
)
- AllisonKennedy
Community Champion
Sugiero hacer el paso 1 en Power Query y cargar la tabla como una tabla real en el modelo de datos (tabla no temporal). A continuación, puede realizar los pasos 2 y 3 con DAX una vez que tenga la tabla cargada en el modelo.
Por lo tanto, obtenga datos de SQL Server en Power Query, seleccione la tabla o vista Industry_Summary.
En la pestaña Inicio, haga clic en el botón Elegir columnas y desmarque Seleccionar todo y, a continuación, marque
RPT_PRD_END_DT, MTH_CTGRY, BRWR_DSC, WAPD_NUM, WAPD_DEN
para seleccionar esas columnas.
Seleccione WAPD_NUM, WAPD_DEN columnas y redondee a dos decimales en la pestaña Transformar.
Seleccione RPT_PRD_END_DT columna y filtrela: puede hacerlo mediante el filtrado avanzado en la lista desplegable.
Cierre y aplique cambios para cargar en el modelo de datos.
No estoy seguro de dónde ha salido esta columna: BRWR_RPT_RIC_SMY_DSC
Pero puede crear un objeto visual de matriz con su grupo por columnas: RPT_PRD_END_DT, BRWR_RPT_RIC_SMY_DSC en Filas. A continuación, cree una medida que calcule:
WAPD_PCT de la WAPD_PCT (SUM(WAPD_den)-0 ,BLANK(), DIVIDE(SUM(WAPD_NUM), SUM(WAPD_den) )
Por último, cree otro objeto visual de matriz con BRWR_DSC en columnas y cree una medida:
Promedio de WAPD_PCT - PROMEDIO(WAPD_PCT)
Espero que ayude y tenga sentido. Avísame cómo te llevas.