2012-07-10 47 views
0

下面是我需要的初始查询,以将字段KLA作为权重将某些字段加权平均。 KLA是一个varchar字段。这是做加权平均的正确方法吗?

select eer.Market,  
    eer.KLA, 
    eer.Term, 
    case scdesc when 'ics' then 'Act' else eer.ScDesc end as ScDesc, 
    eer.Term As Term_Anual,  
    eer.VaMonths,  
     eer.RentPrice,  
     eer.BuyPrice,   
    eer.TransactionID 
from View1 eer 
WHERE ((@Term = 'Long Term' and Term_Anual > 11)  
    OR (@Term = 'Short Term' and Term_Anual < 12))  
    and (ArchiveID in (@ArchiveID)) 
order by eer.market, 
    eer.KLA, 
    eer.ScDesc 

这是我第一次做加权平均,因此有几件事我不确定。

所以我所做的就是尝试通过使用连接来创建CTE。

SELECT [base].Market, 
    [base].MSA, 
    [base].ArchiveID, 
    [base].TransactionID 
    [base].ScDesc, 
    SUM([base].KLA) * [weighted].KLA/SUM([weighted].KLA) as KLA, 
    SUM([base].VaMonths) * [weighted].VaMonths/SUM([weighted].VaMonths) as VaMonths, 
    SUM([base].RentPrice) * [weighted].RentPrice/SUM([weighted].RentPrice) as RentPrice, 
    SUM([base].BuyPrice) * [weighted].BuyPrice/SUM([weighted].BuyPrice) as BuyPrice  
FROM View1 [base] 
INNER JOIN 
(
    select eer.Market,  
     eer.KLA, 
     eer.Term, 
     case scdesc when 'ics' then 'Act' else eer.ScDesc end as ScDesc, 
     eer.Term As Term_Anual,  
     eer.VaMonths,  
      eer.RentPrice,  
      eer.BuyPrice,   
     eer.TransactionID 
from View2 eer 
WHERE((@Term = 'Long Term' and Term_Anual > 11)  
    OR (@Term = 'Short Term' and Term_Anual < 12))  
    and (ArchiveID in (@ArchiveID)) 
order by eer.market, 
    eer.KLA, 
    eer.ScDesc 
) as [weighted] 

另外,我不知道我应该在哪里,或者我应该KLA在两个查询我猜要么得到的重量组。

那么这看起来是正确的尝试使一些字段(与SUM的字段)加权?

我需要一些第一次握住手,因为我没有信心我确信我正在做这件事。这些款项是在金钱,数字等字段类型的领域完成的,所以不用担心它们是否是合适的字段类型。其余的[base]字段。没有加权,我不希望那些加权明显,所以选择他们直接在我的外部查询。

+4

您需要从上述代码中提取问题,因为它没有任何意义。尝试在excel中做一个简单的例子,然后把它转换成你的db,一旦你设法让一个工作系统脱离它。如果你仍然陷入僵局并想要回到这里,那么给我们一个例子来玩一玩,它有一个示例表和示例值;不只是一个模糊的查询,因为我们在这里没有任何线索可能是这些字段中的任何一个! 另外,varchar字段如何暗示权重? – deroby 2012-07-21 12:25:58

+0

简短的答案是否定的,表面上看起来不正确,但正如deroby指出的那样,目前还不清楚你正在努力做什么,所以如果你能用英语说明,我们可以告诉你,如果你的代码匹配。 加权平均的通常定义是总和(值*权重)/总和(权重) – 2012-09-19 20:56:17

回答

0

正如一些评论所提到的,你的问题是不是特别清楚,但如果你在一个表中有一些ValueWeight值:

DECLARE @SampleData TABLE (
    Value DECIMAL(3,2), 
    [Weight] DECIMAL(3,2) 
) 

INSERT INTO @SampleData 
SELECT 6, 3 
UNION 
SELECT 4, 1 
UNION 
SELECT 9, 1 
UNION 
SELECT 5, 6 
UNION 
SELECT 3, 1 
UNION 
SELECT 1, 1 
UNION 
SELECT 3, 2 
UNION 
SELECT 4, 1 

可以返回平均值(mean)和加权平均如下所示:

SELECT AVG(Value) AS Mean, 
     AVG(Value * [Weight]) AS WeightedMean 
FROM @SampleData