使用python生成MDX(嵌入SQL)代码
我正在尝试生成SQL代码(嵌入了mdx)。 到目前为止,我想到的是编写一个函数,我可以像下面这样更改输入:使用python生成MDX(嵌入SQL)代码,python,sql,dynamic,mdx,Python,Sql,Dynamic,Mdx,我正在尝试生成SQL代码(嵌入了mdx)。 到目前为止,我想到的是编写一个函数,我可以像下面这样更改输入: def get_mdx(user , sqlhost = 'SQLBOADHOC' , Start_Year = 2018 , End_Year = 2019 , columns = 'All'): """This function pulls mdx data using an md
def get_mdx(user
, sqlhost = 'SQLBOADHOC'
, Start_Year = 2018
, End_Year = 2019
, columns = 'All'):
"""This function pulls mdx data using an mdx code embedded in a SQL query
-------
Params:
sql_user = Your company user ID
sql_host = The host server usually it is 'SQLBOADHOC'
Start_Year = 2018 for example
End_Year = 2019 for example
Columns: the columns retrieved
------
returns:
df = a dataframe with the data pulled
"""
sql = f"""
Select
"[Time].[Date].[Date].[MEMBER_CAPTION]",
convert(float,"[Measures].[Allowance]") as Allowances
from openquery
(DASHLB_CAP_Reporting, '
With
Member [Measures].[Allowance] AS IIF(Cstr([Measures].[Allowances])="1.#INF", null, [Measures].[Allowances])
Select {{
[Measures].[Allowance]
}} on 0,
NON EMPTY{{crossjoin(
[Subentity].[subentity],
[Time].[Date].[Date]
)}} on 1
from
[Category and Promotions Cube]
where (
[Store].[Store by Brand].[Brand].&[1],
{{[Time].[Time Filter By Month].[Year].&[{Start_Year}],[Time].[Time Filter By Month].[Year].&[{End_Year}]}}
)')
"""
sql_user = f"""company\\{user}"""
sql_host = sqlhost
sql_db = ''
sql_conn = sql_util(sql_user, sql_host, sql_db, is_user=True)
df_sql = sql_conn.pull(sql)
if columns.isdigit:
df_sql = f"""df_sql.iloc[:{columns}]"""
else:
df_sql = df_sql.iloc[:]
mdx_columns= {"Allowances_dic" : {"place1" : f"""convert(float,"[Measures].[Allowance]") as Allowances,""",
"place2" : f""" Member [Measures].[Allowance] AS IIF(Cstr([Measures].[Allowances])="1.#INF", null, [Measures].[Allowances])""",
"place3" : f""" [Measures].[Allowance] """} }
mdx_base = f"""
Select
{place1}
"[Time].[Date].[Date].[MEMBER_CAPTION]" as Dates,
from openquery
(DASHLB_CAP_Reporting, '
With
{place2}
Select {{
{place3}
}} on 0,
NON EMPTY{{crossjoin(
[Subentity].[subentity].&[2],
[Time].[Date].[Date],
)}} on 1
from
[Category and Promotions Cube]
where (
{place4}
[Store].[Store by Brand].[Brand].&[1],
[Subentity].[Subentity Filter].[Subentity].&[2],
{{[Time].[Time Filter By Month].[Year].&[2018],
[Time].[Time Filter By Month].[Year].&[2019]}}
)')
"""
现在我的问题如下,假设我想在我的表中添加一个新的列,比如ConversionRate,我必须在代码中添加几句话,它将变成以下内容:
def get_mdx(user
, sqlhost = 'SQLBOADHOC'
, Start_Year = 2018
, End_Year = 2019
, columns = 'All'):
"""This function pulls mdx data using an mdx code embedded in a SQL query
-------
Params:
sql_user = Your company user ID
sql_host = The host server usually it is 'SQLBOADHOC'
Start_Year = 2018 for example
End_Year = 2019 for example
Columns: the columns retrieved
------
returns:
df = a dataframe with the data pulled
"""
sql = f"""
Select
"[Time].[Date].[Date].[MEMBER_CAPTION]",
convert(float,"[Measures].[Allowance]") as Allowances
from openquery
(DASHLB_CAP_Reporting, '
With
Member [Measures].[Allowance] AS IIF(Cstr([Measures].[Allowances])="1.#INF", null, [Measures].[Allowances])
Select {{
[Measures].[Allowance]
}} on 0,
NON EMPTY{{crossjoin(
[Subentity].[subentity],
[Time].[Date].[Date]
)}} on 1
from
[Category and Promotions Cube]
where (
[Store].[Store by Brand].[Brand].&[1],
{{[Time].[Time Filter By Month].[Year].&[{Start_Year}],[Time].[Time Filter By Month].[Year].&[{End_Year}]}}
)')
"""
sql_user = f"""company\\{user}"""
sql_host = sqlhost
sql_db = ''
sql_conn = sql_util(sql_user, sql_host, sql_db, is_user=True)
df_sql = sql_conn.pull(sql)
if columns.isdigit:
df_sql = f"""df_sql.iloc[:{columns}]"""
else:
df_sql = df_sql.iloc[:]
mdx_columns= {"Allowances_dic" : {"place1" : f"""convert(float,"[Measures].[Allowance]") as Allowances,""",
"place2" : f""" Member [Measures].[Allowance] AS IIF(Cstr([Measures].[Allowances])="1.#INF", null, [Measures].[Allowances])""",
"place3" : f""" [Measures].[Allowance] """} }
mdx_base = f"""
Select
{place1}
"[Time].[Date].[Date].[MEMBER_CAPTION]" as Dates,
from openquery
(DASHLB_CAP_Reporting, '
With
{place2}
Select {{
{place3}
}} on 0,
NON EMPTY{{crossjoin(
[Subentity].[subentity].&[2],
[Time].[Date].[Date],
)}} on 1
from
[Category and Promotions Cube]
where (
{place4}
[Store].[Store by Brand].[Brand].&[1],
[Subentity].[Subentity Filter].[Subentity].&[2],
{{[Time].[Time Filter By Month].[Year].&[2018],
[Time].[Time Filter By Month].[Year].&[2019]}}
)')
"""
所以,我的问题是,每当我向主查询添加新列时,是否有一种优雅的方式来始终修改它?或者,如何在块中构建查询
很抱歉发了这么长的帖子,非常感谢你的帮助!我还是python新手,还是一名实习生,所以我尽我所能快速学习 那么您想知道如何在MDX查询中添加另一列吗?@MoazRub谢谢您的提问,我正在尝试构建一个动态sql查询。在这个意义上,当我添加一个新的列时,比如说在函数中生成了代码中的两行新行,所以我想问一下,我如何才能做到这一点?因此,当用户添加新的columnsOk时,我如何在代码中的不同位置添加几行,因此我认为您想知道如何在MDX中添加列,以便您的动态SQL查询能够发出正确的MDX。是这样吗?@MoazRub我想知道是否有一种模式,我想生成一个函数,该函数接受列名,然后将其粘贴到一个字符串中,稍后将用于主查询!因此,您基本上希望从函数发出MDX,并且希望知道在MDX查询中添加列的模式是什么。我的理解正确吗?