如何将 T-SQL 内连接(两个带有 group by 的子查询)写入 DAX

问题描述 投票:0回答:2

我想使用内部联接连接两个表。标准如下:

  1. 这两个表是预算和交易,它们是连接的

    CUSTOMER_ID = CUSTOMER_ID, FinYear = Transactions_Year

    预算:
    Budgets table Image
    交易:
    Transactions table Image

  2. 计算为:

    SUM(Budget)
    SUM(Transactions[Total Cost Value])

  3. 下面是SQL代码:

    --====Select Statement
    SELECT Budget.[CUSTOMER_ID],[Budget_Year],[Budget_Month],[Budget_Calculation],Transactions.[Total Cost Value Calculation]  
    FROM (
    
    --==SQL SUBQUERY FOR BUDGET
    SELECT    [Budgets].[CUSTOMER_ID] 
        ,[FinYear]  [Budget_Year]
        ,[Month] [Budget_Month]
        ,sum([Budget]) [Budget_Calculation] 
        FROM [SQLTestScripts].[dbo].[Budgets]  
        group by [Budgets].[CUSTOMER_ID],[FinYear],[Month], budget
    ) Budget
    INNER JOIN (
    
    --==SQL SUBQUERY FOR TRANSACTIONS
    SELECT 
    [CUSTOMER_ID]
    ,datepart(year,[Transactions].[TRANSACTION_DATE]) [Transactions_Year]
    ,datepart(month,[Transactions].[TRANSACTION_DATE]) [Transactions_Month]
    ,SUM([COST_VALUE]*QTY_INVOICED )[Total Cost Value Calculation]
    FROM [dbo].[Transactions]
    group by 
        [Transactions].[TRANSACTION_DATE],
        [CUSTOMER_ID]
    ) Transactions 
    on Budget.CUSTOMER_ID = Transactions.CUSTOMER_ID and Budget.[Budget_Year] = Transactions.[Transactions_Year] 
    

我可以在 DAX 中写这个吗?

我尝试使用汇总、过滤器和自然左出连接,但它没有返回正确的结果。

EVALUATE
SUMMARIZE(
    FILTER(NATURALLEFTOUTERJOIN(Budget,Transactions),
    Budget[CUSTOMER_ID]=Transactions[CUSTOMER_ID] 
    && Budget[FinYear] = YEAR(Transactions[TRANSACTION_DATE]) 
    ,Budget[CUSTOMER_ID],Budget[FinYear],Budget[Month]
    ,"Budget Calculation",sum(Budget[Budget]) 
    ,"Total Cost Value Calculation",sum(Transactions[Total Cost Value]) 
)
t-sql group-by powerbi subquery dax
2个回答
0
投票

为了使 DAX 连接函数正常工作,表连接列需要具有相同的名称。您可以使用 SELECTCOLUMNS() 重命名 DAX 表达式中的列,或者使用 ADDCOLUMNS() 添加具有匹配名称的新列。如果您正在寻找内部联接,有一个本机函数 NATURALINNERJOIN() 可以满足您的要求。

但是,根据您的情况和要求,您可能需要考虑在 PowerQuery 中执行联接(转换数据按钮)。它具有更直观的界面,通常更干净/更易于使用。在 PowerQuery 中,您可以选择基表,选择合并表,选择联接列(按住 Ctrl 键单击以选择多个),然后在底部选择内部联接类型。


0
投票

正确答案是:

1:使用

SELECTCOLUMNS
(因为你想重命名具有匹配名称的列)和
SUMMARIZECOLUMNS
(以便你可以进行计算和分组)。

2:用于连接的列添加

&"" 
,这样就不会出现沿袭错误

3:

    VAR BudgetTable = 
        SELECTCOLUMNS(
                SUMMARIZECOLUMNS(
                    Budget[CUSTOMER_ID],
                    Budget[FinYear],
                    Budget[Month],
                    "Budget Calculation",CALCULATE( sum(Budget[Budget]))
                ),
                "Cust", [CUSTOMER_ID] & "",
                "Year", [FinYear] & "",
                Budget[Month],
                [Budget Calculation]
        )
        
        
            
    VAR TransactionTable = 
        SELECTCOLUMNS(
                SUMMARIZECOLUMNS(
                    Transactions[CUSTOMER_ID],
                    Transactions[Transaction_Year],
                    Transactions[Transaction_Month],
                    "Total Cost Value Calculation", CALCULATE(sum(Transactions[Total Cost Value]))
                ),
                "Cust", [CUSTOMER_ID] & "",
                "Year",[Transaction_Year] & "", 
                Transactions[Transaction_Month],
                [Total Cost Value Calculation]
                
        )
    
EVALUATE BudgetTable
EVALUATE TransactionTable

EVALUATE NATURALINNERJOIN(BudgetTable,TransactionTable)```
© www.soinside.com 2019 - 2024. All rights reserved.