Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Get Fabric Certified for FREE during Fabric Data Days. Don't miss your chance! Request now

Reply
Syndicate_Admin
Administrator
Administrator

Quitar totales de resumen de una consulta

Tarde todos,

Tengo una consulta de una tabla de datos que contiene los valores de los elementos de línea individuales, junto con los valores de resumen de los elementos de línea de nivel inferior de una tabla. Vea la captura de pantalla a continuación.

La línea 1 es un resumen de todos los importes de las tarifas en WBS1=21064

Live 4 es un resumen de todos los montos de tarifas en 21064 y WBS2 = 10, etc. etc.

Idealmente, me gustaría eliminar las filas de resumen y solo dejar los montos de tarifa de nivel más bajo para que BI pueda resumirse en las imágenes, etc.

Los datos tienen algunas líneas donde el nivel más bajo está en WBS1, otros con WBS1 y WBS2, y otros donde hay los tres niveles.

Cualquier ayuda sobre cómo limpiar estos datos al nivel más bajo disponible de datos sería apreciada.

Screenshot 2023-03-14 151216.jpg

¡Bien!

10 REPLIES 10
Syndicate_Admin
Administrator
Administrator

RESPUESTA CORRECTA

He encontrado un error en mi solución anterior cuando Max WBS Nesting basado en WBS.1 no es el mismo para todos los WBS.1 secundarios.

Por eso he preparado una nueva versión, pero mejor.

Después de un poco de limpieza en los datos ("null" como texto reemplazado por null)

Paso 1. Agregue una nueva columna ParentPath.

bolfri_0-1690931314605.png

Paso 2. Agregar nueva columna CurrentPath

bolfri_1-1690931348859.png

Paso 3. Agregar nueva columna isParent (comprueba si la ruta actual se puede encontrar en ParentPathList)

bolfri_2-1690931393223.png

Con esta tabla, puede combinar consultas para recibir folumn isParent y filtrar Padres.

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("tZbRboMgFIZfhZhd2gVQYL12y27W2KS9WZpesJUYN4sN2j1Pn6VPNmzaTJh1oF0MEQX5Pw78B1erAEMM7yEKwmCuyg/xXgO7LvdF8et2PNwdD10XQHEIoR4S6l5NQcE6vCaz5NUnSNVGqLFKzeeRu9I8AUlZqk0ueZ2XcqAo1iUeIzoTos5lVgEuN1eArpKcaNgPTKQL+S+Yxf5tcm63m5wBY13oGMCkrGrwVNX5ljcgA2PEbovwKKo8k5d3ovKNyMMFB5s42Kq7egNMGQ5RpwE7FNoTBhOQpD5KiLaU0MkPfkrPQgrFCx1kWSuuO8645JnYClm7O9JAemhbM/LE0e2Z4tvxFKRNQQdSLPa7XaluEggEfRlmYKl4Lg2X/ZkaKTRTI4pHybaewIv4EkX7jHCjaPyOiDdF6hN8oC1gzhs7+sDH1hdzk5AYR57j5CJ/KWKfrlM3qdgnheB27JpB4949kxK9SBF4FVyBs08GxNCWZP6SN8tcwP6d6I1yN8yYvAUYNQFIb9a8AjAoXSDLNrTXNin1X2kGTbdQR7cwny0c2VuY6Wy7/gY=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [#"Contract ID" = _t, #"Contract Name" = _t, WBS.1 = _t, WBS.2 = _t, WBS.3 = _t, WBS.4 = _t, #" Fee " = _t, #"WBS Nesting" = _t, #"Sort Order" = _t]),
    Hierarchy = Table.SelectColumns(Source,{"Contract Name", "WBS.1", "WBS.2", "WBS.3", "WBS.4", "WBS Nesting"}),
    #"Changed Type" = Table.TransformColumnTypes(Hierarchy,{{"Contract Name", type text}, {"WBS.1", type text}, {"WBS.2", type text}, {"WBS.3", type text}, {"WBS.4", type text}, {"WBS Nesting", Int64.Type}}),
    #"Cleaning the data" = Table.ReplaceValue(#"Changed Type","null",null,Replacer.ReplaceValue,Table.ColumnNames(#"Changed Type")),
    #"Add ParentPath" = Table.AddColumn(#"Cleaning the data", "ParentPath", each
if [WBS Nesting] = 4 then
Text.Combine(List.Select({[Contract Name],[WBS.1],[WBS.2],[WBS.3]},each _<> "" and _ <> null)," & ")
else if [WBS Nesting] = 3 then
Text.Combine(List.Select({[Contract Name],[WBS.1],[WBS.2]},each _<> "" and _ <> null)," & ")
else if [WBS Nesting] = 2 then
Text.Combine(List.Select({[Contract Name],[WBS.1]},each _<> "" and _ <> null)," & ")
else [Contract Name]),
    #"Add CurrentPath" = Table.AddColumn(#"Add ParentPath", "CurrentPath", each
    if [Contract Name] = [WBS.1] then [Contract Name] else Text.Combine(List.Select({[Contract Name],[WBS.1],[WBS.2],[WBS.3],[WBS.4]},each _<> "" and _ <> null)," & ")
),
    #"Add isParent" = Table.AddColumn(#"Add CurrentPath", "isParent", each List.Contains(
    Table.ToList(Table.Distinct(Table.SelectColumns(#"Add CurrentPath","ParentPath"))),
 [CurrentPath]))
in
    #"Add isParent"

Syndicate_Admin
Administrator
Administrator

Basado en los datos de ejemplo que ha proporcionado (tabla SampleData).
Paso 1. Crear tabla MaxWBSNesting

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("tZbRboMgFIZfhZhd2gVQYL12y27W2KS9WZpesJUYN4sN2j1Pn6VPNmzaTJh1oF0MEQX5Pw78B1erAEMM7yEKwmCuyg/xXgO7LvdF8et2PNwdD10XQHEIoR4S6l5NQcE6vCaz5NUnSNVGqLFKzeeRu9I8AUlZqk0ueZ2XcqAo1iUeIzoTos5lVgEuN1eArpKcaNgPTKQL+S+Yxf5tcm63m5wBY13oGMCkrGrwVNX5ljcgA2PEbovwKKo8k5d3ovKNyMMFB5s42Kq7egNMGQ5RpwE7FNoTBhOQpD5KiLaU0MkPfkrPQgrFCx1kWSuuO8645JnYClm7O9JAemhbM/LE0e2Z4tvxFKRNQQdSLPa7XaluEggEfRlmYKl4Lg2X/ZkaKTRTI4pHybaewIv4EkX7jHCjaPyOiDdF6hN8oC1gzhs7+sDH1hdzk5AYR57j5CJ/KWKfrlM3qdgnheB27JpB4949kxK9SBF4FVyBs08GxNCWZP6SN8tcwP6d6I1yN8yYvAUYNQFIb9a8AjAoXSDLNrTXNin1X2kGTbdQR7cwny0c2VuY6Wy7/gY=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [#"Contract ID" = _t, #"Contract Name" = _t, WBS.1 = _t, WBS.2 = _t, WBS.3 = _t, WBS.4 = _t, #" Fee " = _t, #"WBS Nesting" = _t, #"Sort Order" = _t]),
    #"Removed Other Columns" = Table.SelectColumns(Source,{"WBS.1", "WBS Nesting"}),
    #"Changed Type" = Table.TransformColumnTypes(#"Removed Other Columns",{{"WBS.1", type text}, {"WBS Nesting", Int64.Type}}),
    #"Grouped Rows" = Table.Group(#"Changed Type", {"WBS.1"}, {{"MaxNesting", each List.Max([WBS Nesting]), type nullable number}})
in
    #"Grouped Rows"

bolfri_0-1690926515937.png

Paso 2. Combine esta tabla con su origen en WBS.1 y expanda MaxNesting Coulmn a su origen.

Paso 3. Crear columna personalizada

if [Contract Name] = [WBS.1] o [WBS Nesting] <> [MaxNesting] then "REMOVE" else "KEEP"

Resultado final:

bolfri_1-1690926666267.png

Filtrar las filas 🙂 REMOVE

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("tZbRboMgFIZfhZhd2gVQYL12y27W2KS9WZpesJUYN4sN2j1Pn6VPNmzaTJh1oF0MEQX5Pw78B1erAEMM7yEKwmCuyg/xXgO7LvdF8et2PNwdD10XQHEIoR4S6l5NQcE6vCaz5NUnSNVGqLFKzeeRu9I8AUlZqk0ueZ2XcqAo1iUeIzoTos5lVgEuN1eArpKcaNgPTKQL+S+Yxf5tcm63m5wBY13oGMCkrGrwVNX5ljcgA2PEbovwKKo8k5d3ovKNyMMFB5s42Kq7egNMGQ5RpwE7FNoTBhOQpD5KiLaU0MkPfkrPQgrFCx1kWSuuO8645JnYClm7O9JAemhbM/LE0e2Z4tvxFKRNQQdSLPa7XaluEggEfRlmYKl4Lg2X/ZkaKTRTI4pHybaewIv4EkX7jHCjaPyOiDdF6hN8oC1gzhs7+sDH1hdzk5AYR57j5CJ/KWKfrlM3qdgnheB27JpB4949kxK9SBF4FVyBs08GxNCWZP6SN8tcwP6d6I1yN8yYvAUYNQFIb9a8AjAoXSDLNrTXNin1X2kGTbdQR7cwny0c2VuY6Wy7/gY=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [#"Contract ID" = _t, #"Contract Name" = _t, WBS.1 = _t, WBS.2 = _t, WBS.3 = _t, WBS.4 = _t, #" Fee " = _t, #"WBS Nesting" = _t, #"Sort Order" = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Contract ID", type date}, {"Contract Name", type text}, {"WBS.1", type text}, {"WBS.2", type text}, {"WBS.3", type text}, {"WBS.4", type text}, {" Fee ", type text}, {"WBS Nesting", Int64.Type}, {"Sort Order", Int64.Type}}),
    #"Merged Queries" = Table.NestedJoin(#"Changed Type", {"WBS.1"}, MAXWBSNesting, {"WBS.1"}, "MAXWBSNesting", JoinKind.LeftOuter),
    #"Expanded MAXWBSNesting" = Table.ExpandTableColumn(#"Merged Queries", "MAXWBSNesting", {"MaxNesting"}, {"MaxNesting"}),
    #"Added Custom" = Table.AddColumn(#"Expanded MAXWBSNesting", "Keep or Remove", each if [Contract Name] = [WBS.1] or [WBS Nesting] <> [MaxNesting] then "REMOVE" else "KEEP")
in
    #"Added Custom"
Syndicate_Admin
Administrator
Administrator

Sin filtros, fue capaz de lograr con transformaciones y algunas sentencias If.

Syndicate_Admin
Administrator
Administrator

Hola

No veo ningún patrón allí en absoluto. Así que no sé qué condición de filtro se puede aplicar para eliminar las filas de color gris.

Syndicate_Admin
Administrator
Administrator

Hola

Similar a la publicación original; Tengo una jerarquía WBS con filas de resumen de los niveles inferiores. No he tenido éxito en el uso de la técnica anterior para eliminar correctamente las filas de resumen y podría usar algo de ayuda sobre cómo modificarlo. Datos de muestra a continuación, tengo cientos de proyectos con diferentes niveles de jerarquía WBS y nomenclatura inconsistente ni ninguna tabla de relación padre hijo.

Datos de muestra a continuación. Necesito eliminar las filas resaltadas ya que esas son sumas de los niños. Cualquier ayuda es apreciada, gracias.

daflores_2-1688352200631.png

ID del contratoNombre del contratoEDT.1WBS.2EDT.3EDT.4 Honorario Anidamiento WBSOrden de clasificación
2020.01Proyecto 1Proyecto 1nulonulonulo $ 14.000,0001
2020.01Proyecto 1Orden de tareas 1nulonulonulo $ 14.000,0013
2020.01Proyecto 1Orden de tareas 1Coordinación de PCnulonulo $ 14.000,0024
2020.01Proyecto 1Orden de tareas 1Coordinación de PCReuniones y coordinaciónnulo $ 7.000,0035
2020.01Proyecto 1Orden de tareas 1Coordinación de PCReuniones y coordinaciónCoordinación de subreuniones $ 7.000,0046
2020.01Proyecto 1Orden de tareas 1Coordinación de PCEstimación de costosnulo $ 7.000,0037
2020.01Proyecto 1Orden de tareas 1Coordinación de PCEstimación de costosEstimaciones de diseño $ 7.000,0048
2022.01Proyecto 2Proyecto 2nulonulonulo $ 972.100,0001
2022.01Proyecto 2Orden de tarea 1 - COnulonulonulo $ 162.100,0012
2022.01Proyecto 2Orden de tarea 1 - COGestión General de Contratosnulonulo $ 800,0023
2022.01Proyecto 2Orden de tarea 1 - COGestión de programasnulonulo $ 500,0026
2022.01Proyecto 2Orden de tarea 1 - COApoyo al programanulonulo $ 800,00210
2022.01Proyecto 2Orden de tarea 1 - COFormación PMnulonulo $ 60.000,00214
2022.01Proyecto 2Orden de tarea 1 - COFormación PMEntrenamiento PM Nivel 1nulo $ 60.000,00315
2022.01Proyecto 2Orden de tarea 1 - COSoporte de PMOnulonulo $ 100.000,00222
2022.01Proyecto 2Orden de tareas 2nulonulonulo $ 95.500,00135
2022.01Proyecto 2Orden de tareas 3nulonulonulo $ 54.000,00139
2022.01Proyecto 2Orden de tareas 4nulonulonulo $ 200.000,00144
2022.01Proyecto 2TO5 - Programa de 3 añosnulonulonulo $ 90.000,00147
2022.01Proyecto 2TO5 - Programa de 3 añosGestión General de Contratosnulonulo $ 4.000,00249
2022.01Proyecto 2TO5 - Programa de 3 añosGestión de programasnulonulo $ 76.000,00253
2022.01Proyecto 2TO5 - Programa de 3 añosFormación PMnulonulo $ 10.000,00262
2022.01Proyecto 2A6nulonulonulo $ 70.500,00165
2022.01Proyecto 2Orden de tareas 7nulonulonulo $ 300.000,00170
Syndicate_Admin
Administrator
Administrator

Hola

Comparta algunos datos, explique la pregunta y muestre el resultado esperado.

Syndicate_Admin
Administrator
Administrator

@rdraytonNBRS ¿Alguna vez resolviste esto? Tengo un problema similar y me encuentro con los mismos problemas

Syndicate_Admin
Administrator
Administrator

@rdraytonNBRS ,

Puede consultar mi código M para obtener más detalles sobre cómo eliminar el resumen.

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("dZBRCgAhCETv4ncfjmbsniW6/zVWra/FICacN6I4JzGokYBH93+/14yZVvtB9xIXCIGgLqZ241HrHUNchlSTN0fKUwUkAiLpVAM2D6d7/y0Q63PZrwejvkw/eCRdHw==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [ContractNumber = _t, WBS1 = _t, WBS2 = _t, WBS3 = _t, Fee = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"ContractNumber", type text}, {"WBS1", Int64.Type}, {"WBS2", Int64.Type}, {"WBS3", Int64.Type}, {"Fee", Int64.Type}}),
    #"Sorted Rows" = Table.Sort(#"Changed Type",{{"Fee", Order.Descending}}),
    #"Grouped Rows" = Table.Group(#"Sorted Rows", {"ContractNumber", "WBS1", "WBS2"}, {{"Count", each _, type table [ContractNumber=nullable text, WBS1=nullable number, WBS2=nullable number, WBS3=nullable number, Fee=nullable number]}}),
    #"Added Custom" = Table.AddColumn(#"Grouped Rows", "Custom", each Table.AddIndexColumn([Count],"Index",1)),
    #"Expanded Custom" = Table.ExpandTableColumn(#"Added Custom", "Custom", {"WBS3", "Fee", "Index"}, {"Custom.WBS3", "Custom.Fee", "Custom.Index"}),
    #"Renamed Columns" = Table.RenameColumns(#"Expanded Custom",{{"Custom.WBS3", "WBS3"}, {"Custom.Fee", "Fee"}, {"Custom.Index", "Index"}}),
    #"Added Custom1" = Table.AddColumn(#"Renamed Columns", "0 remove and 1 keep", each let _Max =
List.Max(
let 
_ContractNumber = [ContractNumber],
_WBS1 = [WBS1],
_WBS2 = [WBS2]
in
Table.SelectRows(#"Renamed Columns",each _ContractNumber = [ContractNumber] and _WBS1 = [WBS1] and _WBS2 = [WBS2])[Index]
,
[Index])
in
if [WBS2] = null then 0 
else if _Max = 1 then 1 else if [Index] = 1 then 0 else 1),
    #"Filtered Rows" = Table.SelectRows(#"Added Custom1", each ([0 remove and 1 keep] = 1)),
    #"Removed Columns" = Table.RemoveColumns(#"Filtered Rows",{"Count", "Index", "0 remove and 1 keep"})
in
    #"Removed Columns"

El resultado es el siguiente.

RicoZhou_0-1678951657880.png

RicoZhou_1-1678951705862.png

Saludos
Rico Zhou

Si esta publicación ayuda, considere Aceptarlo como la solución para ayudar a los otros miembros a encontrarlo más rápidamente.

Gracias por la ayuda. Creo que esta solución solo funcionará cuando solo tenga un valor WBS1 (como en mi ejemplo). Realmente necesito una solución que funcione si tengo VARIOS valores WBS1 en mi tabla. ¿Hay una adición simple aquí?

Vea una muestra de datos más grande a continuación.

rdraytonNBRS_0-1679019808161.png

@v-rzhou-msft - ¿Alguna otra idea sobre mi respuesta anterior? Agradecemos cualquier ayuda.

Helpful resources

Announcements
Fabric Data Days Carousel

Fabric Data Days

Advance your Data & AI career with 50 days of live learning, contests, hands-on challenges, study groups & certifications and more!

October Power BI Update Carousel

Power BI Monthly Update - October 2025

Check out the October 2025 Power BI update to learn about new features.

FabCon Atlanta 2026 carousel

FabCon Atlanta 2026

Join us at FabCon Atlanta, March 16-20, for the ultimate Fabric, Power BI, AI and SQL community-led event. Save $200 with code FABCOMM.