使用python生成MDX(嵌入SQL)代码

使用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

我正在尝试生成SQL代码(嵌入了mdx)。 到目前为止,我想到的是编写一个函数,我可以像下面这样更改输入:

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查询中添加列的模式是什么。我的理解正确吗?