Forum Discussion

Syndicate_Admin's avatar
Syndicate_Admin
Icon for Administrator rankAdministrator
2 years ago

¿Se puede convertir este SQL a DAX?

Este SQL:

DECLARE @StartingDate AS DATE = '20201001'
DECLARE @EndingDate AS DATE = GETDATE()

WITH

FirstSubscription AS (
	SELECT 
		[DonorNummer],
		[DatoKeyStoettePeriode]
	FROM [Medlemsdata].[FactBetalingslinjer]
	WHERE
		BetalingsNr = 1 
		AND AbonnementsNr = 1
		AND DatoKeyStoettePeriode BETWEEN @StartingDate AND @EndingDate
		AND BetalingsmetodeKey NOT IN (-1,-24)
		AND StøttetypeKey IN (24,25,26)
	)

select
	[Customer] = fb.[DonorNummer],
	[Category] = ds.Støttetype,
	[pcs] = COUNT(fb.StøttetypeKey),
	[Amount] = SUM([#Bogført betalt beløb])
from [Medlemsdata].[FactBetalingslinjer] fb
JOIN FirstSubscription fs ON fb.[DonorNummer] = fs.[DonorNummer] AND fb.[DatoKeyStoettePeriode] <= fs.[DatoKeyStoettePeriode]
JOIN Medlemsdata.DimStøttetype ds ON fb.StøttetypeKey = ds.StøttetypeKey
GROUP BY
	fb.[DonorNummer],
	ds.Støttetype
ORDER BY
	1

Startingdate y EndingDate es solo el control deslizante de fecha, por lo que sea cual sea el período que elija, el resultado lo refleja

3 Replies

  • Hola @Bokazoit - Sí, es posible pero con ligeras modificaciones en su código sql

    ya que no admitirá DECLARE En su lugar, definimos directamente las variables usando VAR.
    Emulamos la funcionalidad de la cláusula WITH mediante el uso de DEFINE para definir tablas y medidas calculadas. para realizar group by usaremos la función SUMMARIZE para agrupar los datos y calcular agregados en función de las medidas definidas.

    Puede definir una tabla calculada para FirstSubscription utilizando los mismos parámetros de fecha.
    DEFINIR
    VAR StartingDate = DATE(2020, 10, 01)
    VAR FechaFinalización = HOY()
    EVALUAR
    FILTRO (
    ADDCOLUMNS (
    SUMMARIZECOLUMNS (
    'Datos del miembro'[DonorNumber],
    'Datos de miembro'[DateKeyStoettePeriod]
    ),
    "@BetalingsNr", CALCULATE(COUNTROWS('Datos del miembro'), 'Datos del miembro'[PayNumber] = 1),
    "@AbonnementsNr", CALCULATE(COUNTROWS('Datos de miembro'), 'Datos de miembro'[Nº de suscripción] = 1),
    "@BetalingsmetodeKey", VALUES('Datos del miembro'[Método de pago]),
    "@St øttetypeKey", VALUES('Member Data'[Support TypeKey])
    ),
    [@BetalingsNr] = 1
    && [@AbonnementsNr] = 1
    && NOT ( [@BetalingsmetodeKey] IN { -1, -24 } )
    && [@St øttetypeKey] IN { 24, 25, 26 }
    && 'Datos del miembro'[DateKeyStoettePeriod] >= StartingDate
    && 'Datos de miembro'[DateKeyStoettePeriod] <= FechaFinalización
    )

    Defina una medida para calcular pcs:
    DEFINIR
    MEDIDA 'Medlemsdata'[pcs] =
    COUNTROWS(
    FILTRO(
    «Medlemsdata»,
    'Medlemsdata'[DonorNummer] IN VALUES('Medlemsdata'[DonorNummer])
    )
    )

    calcule una medida para calcular la cantidad de la siguiente manera:
    DEFINIR
    MEDIDA 'Medlemsdata'[Cantidad] =
    SUMX(
    «Medlemsdata»,
    'Medlemsdata'[#Bogført betalt beløb]
    )

    EVALUAR
    RESUMIR(
    «Datos de los miembros»,
    'Datos del miembro'[DonorNumber],
    'Datos de los miembros' [Tipo de soporte],
    "pcs", [pcs],
    "Cantidad", [Cantidad]
    )
    ORDENAR POR
    'Datos de los miembros'[DonorNumber]

    verifique el código Dax anterior y hágaselo saber

    ¿He respondido a tu pregunta? ¡Marca mi publicación como una solución! ¡Esto ayudará a otros en el foro!
    ¡Agradezco sus felicitaciones!

    • Syndicate_Admin's avatar
      Syndicate_Admin
      Icon for Administrator rankAdministrator

      Cuando introduzco su código, dice que la sintaxis de DEFINE es incorrecta.

  • Hola, @Bokazoit

    Para convertir la consulta SQL proporcionada a DAX, puede seguir los pasos que se indican a continuación:

    Cree una tabla de cálculo en Power BI para replicar FirstSubscriptionCTE:

    FirstSubscription = 
    FILTER (
        Medlemsdata[FactBetalingslinjer],
        Medlemsdata[FactBetalingslinjer][BetalingsNr] = 1
        && Medlemsdata[FactBetalingslinjer][AbonnementsNr] = 1
        && Medlemsdata[FactBetalingslinjer][DatoKeyStoettePeriode] >= MIN(DateTable[Date])
        && Medlemsdata[FactBetalingslinjer][DatoKeyStoettePeriode] <= MAX(DateTable[Date])
        && NOT (Medlemsdata[FactBetalingslinjer][BetalingsmetodeKey] IN {-1, -24})
        && (Medlemsdata[FactBetalingslinjer][StøttetypeKey] IN {24, 25, 26})
    )

    Cree métricas para recuentos y sumas:

    CustomerCategoryCount = 
    CALCULATE (
        COUNT ( Medlemsdata[FactBetalingslinjer][StøttetypeKey] ),
        FILTER (
            Medlemsdata[FactBetalingslinjer],
            Medlemsdata[FactBetalingslinjer][DonorNummer] IN VALUES (FirstSubscription[DonorNummer])
            && Medlemsdata[FactBetalingslinjer][DatoKeyStoettePeriode] <= VALUES (FirstSubscription[DatoKeyStoettePeriode])
        )
    )
    
    CustomerCategoryAmount = 
    CALCULATE (
        SUM ( Medlemsdata[FactBetalingslinjer][#Bogført betalt beløb] ),
        FILTER (
            Medlemsdata[FactBetalingslinjer],
            Medlemsdata[FactBetalingslinjer][DonorNummer] IN VALUES (FirstSubscription[DonorNummer])
            && Medlemsdata[FactBetalingslinjer][DatoKeyStoettePeriode] <= VALUES (FirstSubscription[DatoKeyStoettePeriode])
        )
    )

    Para mostrar los resultados, cree un objeto visual de tabla en Power BI y agregue los siguientes campos:
    Cliente de Medlemsdata[FactBetalingslinjer][DonorNummer]
    Categoría de Medlemsdata[DimStøttetype][Støttetype]
    pcs como medida de CustomerCategoryCount
    Importe como medida de CustomerCategoryAmount

    Si lo desea, también puede crear una tabla de resumen en DAX para uso visual:

    SummaryTable = 
    SUMMARIZE (
        Medlemsdata[FactBetalingslinjer],
        Medlemsdata[FactBetalingslinjer][DonorNummer],
        Medlemsdata[DimStøttetype][Støttetype],
        "pcs", [CustomerCategoryCount],
        "Amount", [CustomerCategoryAmount]
    )

    Siguiendo estos pasos, puede replicar la funcionalidad de las consultas SQL en Power BI mediante DAX

    hackcrr

    Si esta publicación ayuda, considere aceptarla como la solución y felicitaciones a esta publicación para ayudar a los otros miembros a encontrarla más rápidamente