jacob-dickey
Estoy usando DirectQuery con Snowflake y para una de mis imágenes recibo este error. Parece que este es un error con Power BI donde no genera el SQL correctamente. Cuando miré la consulta que produjo DirectQuery en mi historial de consultas de Snowflake, noté el problema. Power BI había creado dos subconsultas principales y las había unido. Después de unirlos, hay una cláusula WHERE que no tenía calificadores de tabla para los nombres de las columnas. La columna en la que estaba fallando existía en ambas subconsultas y Snowflake no sabía cómo manejar eso.
¿Alguien sabe una forma de evitar esto o sabe si esto se ha informado en otro lugar? Creo que Power BI debería poder manejar esta operación de informe.
Gracias,
themistoklis
En respuesta a jacob-dickey
En este caso, la mejor (y la opción preferida) en mi opinión es crear una vista en copo de nieve.
Dentro de la vista, cambie el nombre del campo. La conexión PowerBi a View en lugar de Table
No cambie el nombre del campo directamente en la tabla. no recomendaría eso
Anónimo
Quería compartir con cualquier otra persona que vea este hilo que eliminé el mensaje de error al cambiar la relación entre dos tablas en la vista del modelo. Una vez que verifiqué «Asumir integridad referencial», ya no recibí el error. Marcar esta casilla utiliza una UNIÓN INTERNA en lugar de una UNIÓN EXTERNA.
themistoklis
@jacob-dickey
Lo mejor es que nos envíe la consulta que utilizó.
Este error «SError de compilación QL: columna ambigua» se devuelve en casos, por ejemplo, cuando tiene una combinación de 2 tablas y aparece la misma columna en ambas. Cuando hace una declaración de selección y no especifica la tabla a la que pertenece esta columna, arroja un error.
Puede especificar la tabla a través del alias o el propio nombre de la tabla
jacob-dickey
En respuesta a themistoklis
Aquí está la parte de la consulta que está causando el problema. Se ejecutó como está, se producirá un error. He notado que cuando agrego calificadores a las dos columnas «CREADAS» en la cláusula WHERE al final, la consulta funcionará. ¿Hay alguna manera de decirle a Power BI que haga esto?
select "ITBL"."DIM_EQUIPMENT_KEY" as "C2",
"ITBL"."MANUFACTURER",
"ITBL"."CEID",
"ITBL"."MODEL_NAME",
"ITBL"."MODALITY",
"OTBL"."TOTAL_COST"
from
(
select "OTBL"."DIM_EXPENSE_LINE_KEY",
"OTBL"."EXPENSE_LINE_NUMBER",
"OTBL"."EXPENSE_LINE_SYS_ID",
"OTBL"."STATE",
"OTBL"."CREATED_BY",
"OTBL"."CREATED",
"OTBL"."UPDATED_BY",
"OTBL"."UPDATED",
"OTBL"."EXPENSE_LINE_TYPE",
"OTBL"."BILLBACK",
"OTBL"."BILLABLE_REASON",
"OTBL"."EFS_DURING",
"OTBL"."EFS_AFTER",
"OTBL"."START_TIME",
"OTBL"."END_TIME",
"OTBL"."EXTENDED_PRICE",
"OTBL"."LABOR_HOURS",
"OTBL"."QUANTITY_BILLED",
"OTBL"."QUANTITY_SOLD",
"OTBL"."TOTAL_COST",
"OTBL"."UNIT_PRICE",
"OTBL"."TECHNICIAN_ID",
"OTBL"."TECHNICIAN",
"OTBL"."EXTENDED_COST",
"OTBL"."TRIMEDX_LABOR_COST",
"OTBL"."EXPENSE_LINE_COST",
"OTBL"."LABOR_MINUTES",
"OTBL"."AMOUNT",
"OTBL"."CUSTOMER_INVOICE_NUMBER",
"OTBL"."CUSTOMER_INVOICE_AMOUNT",
"OTBL"."SHORT_DESCRIPTION",
"OTBL"."SOURCE",
"ITBL"."DIM_EXPENSE_LINE_KEY" as "C1",
"ITBL"."DIM_WORK_ORDER_KEY",
"ITBL"."DIM_CUSTOMER_KEY",
"ITBL"."DIM_EQUIPMENT_KEY",
"ITBL"."DIM_RECEIPT_LINE_KEY",
"ITBL"."DIM_RECEIPT_KEY"
from
(
select "DIM_EXPENSE_LINE_KEY",
"EXPENSE_LINE_NUMBER",
"EXPENSE_LINE_SYS_ID",
"STATE",
"CREATED_BY",
"CREATED",
"UPDATED_BY",
"UPDATED",
"EXPENSE_LINE_TYPE",
"BILLBACK",
"BILLABLE_REASON",
"EFS_DURING",
"EFS_AFTER",
"START_TIME",
"END_TIME",
"EXTENDED_PRICE",
"LABOR_HOURS",
"QUANTITY_BILLED",
"QUANTITY_SOLD",
"TOTAL_COST",
"UNIT_PRICE",
"TECHNICIAN_ID",
"TECHNICIAN",
"EXTENDED_COST",
"TRIMEDX_LABOR_COST",
"EXPENSE_LINE_COST",
"LABOR_MINUTES",
"AMOUNT",
"CUSTOMER_INVOICE_NUMBER",
"CUSTOMER_INVOICE_AMOUNT",
"SHORT_DESCRIPTION",
"SOURCE"
from "PRD"."REPORTING"."DIM_EXPENSE_LINE"
where "BILLBACK" is not null
) as "OTBL"
left outer join "PRD"."REPORTING"."FCT_EXPENSE_LINE" as "ITBL" on ("OTBL"."DIM_EXPENSE_LINE_KEY" = "ITBL"."DIM_EXPENSE_LINE_KEY")
) as "OTBL"
left outer join
(
select "DIM_EQUIPMENT_KEY",
"EQUIPMENT_SYS_ID",
"EQUIPMENT_NUMBER",
"ASSET_TAG",
"DEPARTMENT_SYS_ID",
"DEPARTMENT",
"DEPARTMENT_PRIMARY_CONTACT_ID",
"DEPARTMENT_PRIMARY_CONTACT",
"INSTALL_DATE",
"VALID_INSTALL_DATE",
"IP_ADDRESS",
"VALID_IP_ADDRESS",
"MAC_ADDRESS",
"VALID_MAC_ADDRESS",
"MANUFACTURER_ID",
"MANUFACTURER",
"LEGACY_MANUFACTURER_ID",
"MANUFACTURER_CREATED",
"EQUIPMENT_NAME",
"SERIAL_NUMBER",
"CREATED",
"UPDATED",
"ENTERED_DATE",
"CEID",
"OLD_CEID",
"CONNECTED_TO_NETWORK",
"DEVICE_STATUS",
"SUB_STATUS",
"DISPOSITION_DATE",
"REACTIVATION_DATE",
"MANUFACTURED_DATE",
"LAST_PM_DATE",
"NEXT_PM_DATE",
"MISSION_CRITICAL",
"EQUIPMENT_CRITICALITY",
"PM_MANAGED",
"RSQ_EQUIPID",
"EQUIPMENT_COST",
"WARRANTY_START_DATE",
"WARRANTY_END_DATE",
"WARRANTY_TYPE",
"STRATEGY_SELECTION",
"CURRENT_STRATEGY",
"VENDOR_SITE_ID",
"AE_TITLE",
"DOES_DEVICE_HAVE_EPHI",
"ALARMED",
"RDM",
"SITE_SPECIFIC_SVC",
"MODEL_NUMBER",
"MODEL_SYS_ID",
"MODEL_NAME",
"MODEL_ACTIVE",
"EM_SCORE",
"MODEL_CLASS",
"MODEL_ID",
"CAPABLE_OF_NETWORK_CONNECTION",
"NO_LONGER_MANUFACTURED_DATE",
"OEM_PART_SUPPORT_NOT_AVAILABLE_DATE",
"OEM_PART_SUPPORT_NOT_AVAILABLE",
"TRIMEDX_END_OF_SUPPORT_LIFE_DATE",
"MODEL_CLASS_RISK",
"PRICE_LEVEL",
"MODEL_SVC",
"MODEL_OS",
"DESCRIPTION_SYS_ID",
"DESCRIPTION_ACTIVE",
"DESCRIPTION",
"DESCRIPTION_ID",
"MODALITY",
"SERVICE_LINE",
"MAJOR_CATEGORY",
"MINOR_CATEGORY",
"CAPITAL_TYPE",
"COMMERCIAL_PACKAGE",
"ESSENTIALS_COMMERCIAL_OFFERING_FLAG",
"ADVANCED_COMMERCIAL_OFFERING_FLAG",
"PRO_COMMERCIAL_OFFERING_FLAG",
"OPERATING_SYSTEM",
"OPERATING_SYSTEM_FAMILY",
"OPERATING_SYSTEM_VERSION",
"OPERATING_SYSTEM_EXTENDED_SUPPORT_END_DATE",
"OPERATING_SYSTEM_MAINSTREAM_SUPPORT_END_DATE",
"MODEL_TYPE_ID",
"MODEL_TYPE",
"PM_SCHEDULE",
"PM_FREQUENCY_1",
"PM_FREQUENCY_2",
"PM_FREQUENCY_3",
"PM_FREQUENCY_4",
"PM_PROCEDURE_1",
"PM_PROCEDURE_2",
"PM_PROCEDURE_3",
"PM_PROCEDURE_4",
"RELATED_SERVICE_OFFERING",
"CE_FLAG",
"MME_FLAG",
"URL",
"LAST_TOUCH_DATE",
"REGULATORY_ENVIRONMENT",
"DEVICE_STORING_TRANSMITTING_DISPLAYING_PHI",
"PHYSICAL_LOCATION",
"PRIMARY_TECHNICIAN_ID",
"PRIMARY_TECHNICIAN",
"SECONDARY_TECHNICIAN_ID",
"SECONDARY_TECHNICIAN",
"PM_TECHNICIAN_ID",
"PM_TECHNICIAN",
"INSTALL_STATUS",
"ASSIGNMENT_GROUP",
"PM_MONTH",
"CUSTOMER_DEVICE_EMR_ID",
"DAYS_IN_SERVICE",
"LIFETIME_TOTAL_COST",
"PM_COUNT",
"DATE_ADDED",
case
when "MISSION_CRITICAL" = TRUE and not "MISSION_CRITICAL" is null
then CAST(1 as INTEGER)
else CAST(0 as INTEGER)
end as "C1",
case
when "MISSION_CRITICAL" = TRUE and not "MISSION_CRITICAL" is null
then CAST(5 as INTEGER)
else CAST(10 as INTEGER)
end as "C2",
{ fn concat('A', "EQUIPMENT_SYS_ID") } as "C3"
from "PRD"."REPORTING"."DIM_EQUIPMENT"
where { fn convert("CE_FLAG", SQL_DOUBLE) } = CAST(1 as DOUBLE) and not "CE_FLAG" is null
) as "ITBL"
on ("OTBL"."DIM_EQUIPMENT_KEY" = "ITBL"."DIM_EQUIPMENT_KEY")
where (((((("CE_FLAG" = CAST(1 as DECIMAL) and "CREATED" < CAST('2020-10-03 00:00:00.00' as TIMESTAMP)) and "CREATED" >= CAST('2020-06-05 00:00:00.00' as TIMESTAMP)) and (not "DEVICE_STATUS" = 'Archived' or "DEVICE_STATUS" is null)) and (not "DEVICE_STATUS" = 'Disposition' or "DEVICE_STATUS" is null)) and not "MODALITY" is null) and (not "MODEL_NAME" = 'UNMATCHED' or "MODEL_NAME" is null)) and not "DESCRIPTION" is null
themistoklis
En respuesta a jacob-dickey
Hola @jacob-dickey
¿Quiere decir realmente si PowerBI puede agregar los alias correctos justo al lado de los nombres de los campos?
Esto no se puede hacer con PowerBI.
Para darle algo de contexto.
La consulta que escribió también mostrará el mismo mensaje de error si la ejecuta en cualquier cliente de base de datos. Es un error generado por la base de datos y no por PowerBI. En otras palabras, el error dice que no escribió la consulta correctamente y necesita hacer las modificaciones necesarias.
En tu consulta usas 2 tablas ITBL y OTBL. Para todos los campos que ha utilizado un alias, pero no en los campos de la donde declaración. Esta es una mala escritura de una consulta SQL.
también Creado campo es uno de los campos principales en una tabla de base de datos. Si no especifica el alias de la tabla correctamente, devolverá datos incorrectos.
La solución en su caso es poner un alias (ITBL u OTBL) delante de cada campo en la instrucción where.
espero que haya ayudado
jacob-dickey
En respuesta a themistoklis
Correcto, estoy de acuerdo en que ese es el problema con la consulta. Sin embargo, no escribí esa consulta, lo hizo Power BI DirectQuery.
Encontré esa consulta en mi historial de consultas de Snowflake después de recibir el error en Power BI.
themistoklis
En respuesta a jacob-dickey
@jacob-dickey
Si no recuerdo mal, no puede escribir una consulta personalizada y enviarla a través de PowerBI a Snowflake.
Solo puede conectarse directamente a las mesas en Snowflake. Corrígeme si me equivoco.
Tengo entendido que tiene varios pasos en el editor de Power Query y uno de los pasos une 2 tablas. ¿Es esto correcto?
Si este es el caso, creo que la mejor manera de superar este problema es agregar un paso más y eliminar las columnas duplicadas de la tabla que no le interesan. ¿Espero que esto tenga sentido?
jacob-dickey
En respuesta a themistoklis
Correcto, por lo que puedo entender, no puede enviar consultas personalizadas a través de Power BI. Solo puede traer tablas y unirlas creando relaciones en el modelo de datos. Así es como uní las tablas que aparecen en mi consulta anterior.
Estoy de acuerdo, creo que el problema se resolverá si una de las columnas «CREADAS» se eliminó del modelo de datos para que solo apareciera una en el resultado de DirectQuery. Sin embargo, estoy usando ambas columnas «CREADO» en varias partes del informe.
¿Cree que actualmente la única opción sería editar la tabla base en Snowflake para cambiar el nombre de la columna? Si es así, consideraría que este error es un error de Power BI. Creo que debería poder manejar este tipo de operación de informe.
themistoklis
En respuesta a jacob-dickey
En este caso, la mejor (y la opción preferida) en mi opinión es crear una vista en copo de nieve.
Dentro de la vista, cambie el nombre del campo. La conexión PowerBi a View en lugar de Table
No cambie el nombre del campo directamente en la tabla. no recomendaría eso
jacob-dickey
En respuesta a themistoklis
Estoy de acuerdo, desafortunadamente, creo que esta podría ser la única solución viable en este momento. Desearía que hubiera una mejor manera ya que esto causará algunos cambios, pero aún así debería funcionar. ¡Gracias por tu ayuda!