对每一行进行复杂计算的 SQL Server 查询

Posted

技术标签:

【中文标题】对每一行进行复杂计算的 SQL Server 查询【英文标题】:SQL Server Query with complex calculations for every row 【发布时间】: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) 有外键关系 【参考方案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,我将如何分配条件子句?

以上是关于对每一行进行复杂计算的 SQL Server 查询的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server基础之游标

SQL Server游标

sql server 游标的知识

求sql语句:选出一个查询结果中id最小的一行

SQL之复杂查询与视图

SQL之复杂查询与视图