在查询行中忽略重复调用函数只对每个用户ID一次

时间:2014-11-24 07:31:44

标签: sql master details

每个人都有......

我有三个表格的例子

First(Master_Table)

Master_ID | Name
----------------
     1    | John
     2    | Max
     3    | Liza

秒(Activites_Table)

Activ_ID  | Activity_Name | Master_ID
-------------------------------
     1    |  Swimming     |     1
     2    |  Football     |     1
     3    |  PlayStation  |     1
     4    |  Boxing       |     2

第三(Balances_Table)

Balance_ID| Balance | Master_ID
-------------------------------
     1    |  2000   |     1
     2    |  3000   |     1
     3    |  1500   |     1
     4    |  2500   |     2

我有一个名为(fn_calc_balance_for_user)的函数,用于对第三个表(余额)进行一些计算,并使用First Table中的一些参数Bathed throw查询。

我有sql查询从Master_Table + Activites_Table和Balances_Table渲染数据:

select dbo.Master_Table.Master_ID,
       dbo.Master_Table.Name,
       Activites_Table.Activity_Name ,
      (select dbo.fn_calc_balance_for_user(dbo.Master_Table.Master_ID) as EXP1) as Total_Balance
From   dbo.Master_Table INNER JOIN dbo.Activites_Table
       ON 
       dbo.Master_Table.Master_ID = dbo.Activites_Table.Master_ID

查询结果将是:

Master_ID | Name | Activity_Name | Total_Balance
------------------------------------------------
    1     | John |   Swimming    |    6500
    1     | John |   Football    |    6500
    1     | John |   PlayStation |    6500
    1     | Max  |   Boxing      |    2500

作为这一点,每一件事都有效但注意功能callecd(fn_calc_balance_for_user) 将在该查询的每一行上调用,并且函数只是例如,真正的函数进行更复杂的计算,并且它对于执行该操作的性能不利 我的水晶报告将显示结果:

_______________________________________________________________

ID      : (1)
Name    : (John)
Balance : (6500)

Activities :
--------------------
- Swimming
- Football
- PlayStation
_______________________________________________________________

ID      : (2)
Name    : (Max)
Balance : (2500)

Activities :
--------------------
- Boxing
______________________________________________________________

我的问题是: - 如何为每个Master_ID调用一次(fn_calc_balance_for_user),而不是在所有行上调用 我的意思是,当你看到结果时,你会注意到john记录为3行,并且该函数上的每一行称为i只需要为每个用户提供,例如john,max等...执行一次该函数而不是每行都保存性能,有人告诉我你必须使用分组,我可以使用它,但在我的水晶报告中使用Master_ID进行分组,但在原始的sql上如何定位数据而不是每次我们都重复调用(fn_calc_balance_for_user)在activites_table上排一行

这是讨论男孩......

感谢每个人。

1 个答案:

答案 0 :(得分:0)

试试这个:

select dbo.Master_Table.Master_ID,
       dbo.Master_Table.Name,
       Activites_Table.Activity_Name ,
       t.Total_Balance
From   dbo.Master_Table INNER JOIN dbo.Activites_Table
       ON 
       dbo.Master_Table.Master_ID = dbo.Activites_Table.Master_ID

       inner join (select Master_ID, 
                          fn_calc_balance_for_user(t.Master_ID) as Total_Balance
                     from (select distinct Master_ID
                             from Master_Table)t)t
       on t.Master_ID = dbo.Activites_Table.Master_ID;

目标是找到唯一的Master_ID,并为每个人调用fn_calc_balance_for_user一次。 可以使用上面的单独查询轻松实现。