
================================================================================
MEDIDAS DAX CON ANTI-PATRONES (MAL) Y VERSIONES OPTIMIZADAS (BIEN)
================================================================================
Copia cada medida en Power BI Desktop → Modelado → Nueva medida
Tabla destino recomendada: "Medidas"

================================================================================
CRÍTICO #1: SUMX sobre tabla de hechos
================================================================================

Total Sales SUMX (MAL) = 
    SUMX(FactSales, FactSales[Qty] * FactSales[UnitPrice])

Total Sales SUM (BIEN) = 
    SUM(FactSales[Amount])

================================================================================
CRÍTICO #2: Condición dentro de SUMX (London Sales)
================================================================================

London Sales SUMX (MAL) = 
    SUMX(FactSales,
        IF(FactSales[RegionID] = 6,
            FactSales[Amount],
            BLANK()
        )
    )

London Sales CALC (BIEN) = 
    CALCULATE(
        SUM(FactSales[Amount]),
        DimRegion[RegionName] = "London"
    )

================================================================================
ALTO #3: FILTER sobre tabla de hechos
================================================================================

Filtered Sales FILTER (MAL) = 
    CALCULATE(
        SUM(FactSales[Amount]),
        FILTER(FactSales, FactSales[RegionID] = 3)
    )

Filtered Sales Pred (BIEN) = 
    CALCULATE(
        SUM(FactSales[Amount]),
        DimRegion[RegionName] = "East"
    )

================================================================================
ALTO #4: SUMMARIZECOLUMNS en medida
================================================================================

Top Products SUMMARIZE (MAL) = 
    SUMX(
        SUMMARIZECOLUMNS(
            FactSales[ProductID],
            "Sales", SUM(FactSales[Amount])
        ),
        [Sales]
    )

Top Products VALUES (BIEN) = 
    SUMX(
        VALUES(DimProduct[ProductName]),
        CALCULATE(SUM(FactSales[Amount]))
    )

================================================================================
MEDIO #5: DISTINCTCOUNT alta cardinalidad
================================================================================

Unique Emails DC (MAL) = 
    DISTINCTCOUNT(DimCustomer[CustomerEmail])

Unique Customers COUNT (BIEN) = 
    COUNTROWS(VALUES(FactSales[CustomerID]))

================================================================================
MEDIO #6: ALL indiscriminado
================================================================================

All Sales ALL (MAL) = 
    CALCULATE(
        SUM(FactSales[Amount]),
        ALL(FactSales)
    )

All Sales Selected (BIEN) = 
    CALCULATE(
        SUM(FactSales[Amount]),
        ALLSELECTED(FactSales)
    )

================================================================================
ALTO #7: Inteligencia temporal nativa en DirectQuery
================================================================================

Sales LY Native (MAL) = 
    CALCULATE(
        SUM(FactSales[Amount]),
        SAMEPERIODLASTYEAR(DimDate[FullDate])
    )

Sales LY Manual (BIEN) = 
    VAR _Year = SELECTEDVALUE(DimDate[Year])
    VAR _Month = SELECTEDVALUE(DimDate[Month])
    RETURN
        CALCULATE(
            SUM(FactSales[Amount]),
            ALL(DimDate),
            DimDate[Year] = _Year - 1,
            DimDate[Month] = _Month
        )

================================================================================
CRÍTICO #8: CallbackDataID por filtros dinámicos en iteradores
================================================================================

Sales con Check (MAL) = 
    SUMX(FactSales,
        VAR _Check =
            CALCULATE(
                COUNTROWS(FactSales),
                FILTER(ALL(FactSales),
                    FactSales[RegionID] = 6
                )
            )
        RETURN
            IF(_Check > 0, FactSales[Amount], BLANK())
    )

London Sales Simple (BIEN) = 
    CALCULATE(
        SUM(FactSales[Amount]),
        DimRegion[RegionName] = "London"
    )

================================================================================
MEDIDAS DE DIAGNÓSTICO DEL DASHBOARD
================================================================================

_Total Medidas = COUNTROWS(INFO.MEASURES())

_Medidas Críticas = 
    COUNTROWS(
        FILTER(INFO.MEASURES(),
            CONTAINSSTRING([Expression], "SUMX") ||
            CONTAINSSTRING([Expression], "AVERAGEX") ||
            CONTAINSSTRING([Expression], "SUMMARIZECOLUMNS")
        )
    )

_Medidas de Alto Riesgo = 
    COUNTROWS(
        FILTER(INFO.MEASURES(),
            CONTAINSSTRING([Expression], "FILTER(")
        )
    )

_Riesgo Total = [_Medidas Críticas] + [_Medidas de Alto Riesgo]

_Porcentaje Riesgo = DIVIDE([_Riesgo Total], [_Total Medidas], 0)

_Color Riesgo = 
    SWITCH(TRUE(),
        [_Porcentaje Riesgo] > 0.30, "🔴 CRÍTICO",
        [_Porcentaje Riesgo] > 0.15, "🟡 ALTO",
        "🟢 OK"
    )

_Estado Dashboard = 
    IF([_Porcentaje Riesgo] > 0.30, "Requiere optimización urgente",
        IF([_Porcentaje Riesgo] > 0.15, "Revisar medidas lentas", "Rendimiento óptimo")
    )

================================================================================
TABLA DE AUDITORÍA AUTOMÁTICA
================================================================================

AuditoriaMedidas = 
    ADDCOLUMNS(
        INFO.MEASURES(),
        "Tiene_SUMX", IF(CONTAINSSTRING([Expression], "SUMX"), "SÍ", "NO"),
        "Tiene_AVERAGEX", IF(CONTAINSSTRING([Expression], "AVERAGEX"), "SÍ", "NO"),
        "Tiene_FILTER", IF(CONTAINSSTRING([Expression], "FILTER("), "SÍ", "NO"),
        "Tiene_ALL", IF(CONTAINSSTRING([Expression], "ALL(") || CONTAINSSTRING([Expression], "REMOVEFILTERS"), "SÍ", "NO"),
        "Tiene_SUMMARIZECOLUMNS", IF(CONTAINSSTRING([Expression], "SUMMARIZECOLUMNS"), "SÍ", "NO"),
        "Tiene_DISTINCTCOUNT", IF(CONTAINSSTRING([Expression], "DISTINCTCOUNT"), "SÍ", "NO"),
        "Tiene_SEARCH", IF(CONTAINSSTRING([Expression], "SEARCH") || CONTAINSSTRING([Expression], "CONTAINSSTRING"), "SÍ", "NO"),
        "Nivel_Riesgo",
            SWITCH(TRUE(),
                CONTAINSSTRING([Expression], "SUMX") || CONTAINSSTRING([Expression], "AVERAGEX") || CONTAINSSTRING([Expression], "SUMMARIZECOLUMNS"), "CRÍTICO",
                CONTAINSSTRING([Expression], "FILTER("), "ALTO",
                CONTAINSSTRING([Expression], "ALL(") || CONTAINSSTRING([Expression], "REMOVEFILTERS") || CONTAINSSTRING([Expression], "DISTINCTCOUNT"), "MEDIO",
                "OK"
            )
    )
