同一表内的计算

时间:2018-06-26 04:55:42

标签: sql sql-server

我有一个名为factprojection的表,该表具有如图中所示的列。

我想将“度量”列中具有“总行数和要求的RSV”的“值”列乘以“度量”列中具有“线平均值”的“值”列,按乘员类型将其连接。我应该创建一个临时表然后执行乘法吗?有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

我假设所有/CrewType值都在两个表中,所以下面的所有答案都使用内部联接(任何不匹配的行都不会返回)

公用表表达式(CTE)

您可以定义在表上执行查询的通用表表达式,然后为这些查询命名。然后,您可以加入这些“子表”,而不是生成任何临时数据:

DateKey

自我加入

一种等效但在视觉上不太明显的方法是自联接,为表赋予不同的别名:

WITH LineAverage as (
    select * 
    from factprojection
    where Measure = 'Line Average'
)
,TotalLines as (
    select * 
    from factprojection
    where Measure = 'Total Lines & RSV Required'
)
select
    LA.CrewType
    ,LA.DateKey
    ,LA.Value*TL.Value as newvalue
from LineAverage LA 
inner join
TotalLines TL
    ON LA.DateKey = TL.DateKey
    and LA.CrewType = TL.CrewType

请注意,select LA.CrewType ,LA.DateKey ,LA.Value*TL.Value as newvalue from factprojection LA, factprojection TL where LA.DateKey = TL.DateKey and LA.CrewType = TL.CrewType and LA.Measure = 'Line Average' and TL.Measure = 'Total Lines & RSV Required' 子句中的连接条件以及对Measure值的限制。尽管此查询的编写时间短一些,但与CTE方法相比,它会失去一些可读性。

这里我还使用了WHERE的逗号形式,其中INNER JOIN子句被放置在ON子句中的联接条件所代替。