gcam032
I,
Tengo una conexión ODBC a una gran fuente de datos (Impala). Los datos son grandes y necesito crear dinámicamente la instrucción SQL en función de algunos parámetros.
Parámetros:
Año1 = 2019
Año2 = 2020
ListaMes1 = 10,11,12
listamensual2 = 1
SQL dinámico en pseudocódigo:
Seleccione *
de db1.table1
Si la duración del Año2 > 0, entonces wherecls = «where ((año = «&Año1&» y mes = «&ListaMes1&») o (año = «&Año2&» y mes = «&ListaMes2&»))»
else wherecls = «where year = «&Year1&» and month = «&Monthlist1&»»
Espero que quede claro. Básicamente, necesito modificar la consulta SQL que paso a la fuente dinámicamente en función de la presencia o ausencia de datos en ciertos parámetros.
Gracias
gcam032
Encontré una solución a través de prueba y error.
Tomó un enfoque de dos pasos:
1. Cree una consulta para generar una cláusula where dinámica:
let
WhrCls = if Text.Length(Year1) = 4 and Text.Length(Year2) = 4 then
"where ((year = "&Year1&" and month in ("&#"Month LIst 1 (comma separated values)"&"))
or (year = "&Year2&" and month in ("&#"Month List 2 (comma separated values)"&")))"
else if Text.Length(Year1) = 4 and Text.Length(Year2) is null then
"where (year = "&Year1&" and month in ("&#"Month LIst 1 (comma separated values)"&"))"
else
"where (year = "&Year2&" and month in ("&#"Month List 2 (comma separated values)"&"))"
in
WhrCls
2. Usé este resultado de consulta en mi consulta de base de datos:
select *
from "&dbname&".table1
"&DynamicWhereClause&"
Me imagino que puedes hacer esto en un solo paso, pero esto para mí es un poco más limpio y fácil de administrar. ¡Funciona bien!
Gareth
gcam032
Encontré una solución a través de prueba y error.
Tomó un enfoque de dos pasos:
1. Cree una consulta para generar una cláusula where dinámica:
let
WhrCls = if Text.Length(Year1) = 4 and Text.Length(Year2) = 4 then
"where ((year = "&Year1&" and month in ("&#"Month LIst 1 (comma separated values)"&"))
or (year = "&Year2&" and month in ("&#"Month List 2 (comma separated values)"&")))"
else if Text.Length(Year1) = 4 and Text.Length(Year2) is null then
"where (year = "&Year1&" and month in ("&#"Month LIst 1 (comma separated values)"&"))"
else
"where (year = "&Year2&" and month in ("&#"Month List 2 (comma separated values)"&"))"
in
WhrCls
2. Usé este resultado de consulta en mi consulta de base de datos:
select *
from "&dbname&".table1
"&DynamicWhereClause&"
Me imagino que puedes hacer esto en un solo paso, pero esto para mí es un poco más limpio y fácil de administrar. ¡Funciona bien!
Gareth
VasTg
@gcam032
Consulte estas publicaciones.
https://community.powerbi.com/t5/Desktop/How-do-I-pass-parameters-to-my-SQL-statement/mp/118716
https://community.powerbi.com/t5/Power-Query/parameters-to-SP-or-Sql-query/mp/57734
http://biinsight.com/power-bi-desktop-query-parameters-part2-dynamic-data-masking-and-query-parameter….
O mira más de estas publicaciones aquí..
https://community.powerbi.com/t5/forums/searchpage/tab/message?advanced=false&allow_punctuation=fals…
si te sirve márcalo como solución
Felicitaciones también son agradables
gcam032
En respuesta a VasTg
Gracias, estos no cubren lo que necesito.
Quiero ejecutar una consulta SQL con diferentes cláusulas where (dinámicamente) en función de la presencia de datos en un parámetro. Me gustaría saber cómo hacer un if/then/else más complejo en caso de que tenga más de 2 variaciones de la cláusula where.