【问题标题】:SQL Server Query with complex calculations for every row对每一行进行复杂计算的 SQL Server 查询
【发布时间】:2009-07-23 17:29:59
【问题描述】:

情况就是这样。
表a
可乐1可乐2

表b
colb1 colb2 colb3 colb4 colb5

表c
colc1 colc2 colc3

对于 cola2 = colb1 和 colb4 = colc12 的每个值,获取 colb2
对于 cola2 = colb1 和 colb5 = colc3 的每个值,获取 colb3

为每个 cola2 计算 (colb3- colb2) * size * factor1。
计算每个 cola2 的 SUM((colb3- colb2) * size * factor1)
计算每个 cola2 的 AVG((colb3- colb2) * size * factor1)

(colb3- colb2) * size * factor1 的值也需要存储在表格中以供其他计算使用。我尝试使用多语句表值用户定义函数。但无法在同一个表中返回聚合值和单个值。如何在同一个连接查询中使用多个 UDF?我还有什么其他功能可以使用吗?

样本数据: 表a
id1 prod1

表 b
id1 日期从日期到 id1 id2
id2 日期从日期到 id3 id4

表 c
id1 日期价格
id2 日期价格
id3 日期价格
id4 日期价格
表 b(id1) 匹配表 c(id1)
表 b(id2) 匹配表 c(id2)

我需要从表 c 中获取表 b 中两个 id 的价格,这样我就可以减去这些值并找到结果的总和。 感谢任何帮助。

【问题讨论】:

  • 您缺少一些重要信息。首先,表 c 是如何连接到其他表的?
  • 表 b(colb4, colb5) 与表 c (colc2, colc3) 有外键关系

标签: sql-server-2008 user-defined-functions


【解决方案1】:

为什么不能用简单的 SQL 语句来做呢?我没觉得这里有什么太难的地方

select cola2, 
CASE WHEN cola2 = colb1 AND colb4 = colc12 THEN colb2 ELSE NULL END as Calculation1, 
CASE WHEN cola2 = colb1 AND colb5 = colc3 THEN colb3 ELSE NULL END AS Calculation2,
 (colb3 - colb2) * size * factor1 as Calculation3, <...>
INTO #intermediate
FROM tablea 
INNER JOIN tableb ON <...>
INNER JOIN tablec ON <...>

SELECT SUM(Calculation3) as SumCalculation3, AVG(Calculation3) as AvgCalculation3
FROM #intermediate

当然……除非您遗漏了问题中的其他部分。但总的来说,使用中间表是可以的,而且通常是处理这类复杂计算的最快方法。试图将它们全部打包到一个 SQL SELECT 中只是要求维护噩梦。

【讨论】:

  • 谢谢。我觉得你的想法很有用。如果我要在 colb4 = colc12 上连接表 b 和表 c,获取 colb3 和在 colb5 = colc2 上,获取 colb3,我将如何分配条件子句?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
相关资源
最近更新 更多