2017-03-03 461 views
2

我想在SQL Server中计算加权平均值。我知道有很多问题解决了这个问题,但是我有另外一个问题,我查询了很多其他的列,如GROUP BY集合函数像sum()和avg()。SQL Server:加权平均值+ GROUP BY

这里是我的查询:

SELECT 
    AVG(tauftr.kalkek) AS 'PurchPrice', 
    SUM(tauftr.amount) AS 'Amount', 
    AVG(tauftr.price) AS 'SellingPrice', 
    tauftr.product AS 'Product', 
    auftrkopf.ins_usr AS 'Seller', 
    DATEPART(wk, auftrkopf.date) AS 'Week', 
    AVG([margin]) AS 'Margin' /* <--- THIS IS WRONG */ 
    /* CALCULATE HERE: WEIGHTED AVERAGE BETWEEN 'amount' and 'margin' */ 
FROM 
    [tauftr] AS tauftr 
JOIN 
    tauftrkopf AS auftrkopf ON tauftr.linktauftrkopf = auftrkopf.kopfnr 
WHERE 
    auftrkopf.[status] = 'L' 
    AND auftrkopf.typ = 'B' 
    AND auftrkopf.date >= '01.03.2017' 
    AND auftrkopf.ins_usr ='HS' 
GROUP BY 
    tauftr.product, auftrkopf.ins_usr, DATEPART(wk,auftrkopf.date) 

我想这可能是可能使用INNER JOIN一模一样的WHERE条款,但我不想执行查询两次。我不知道要加入什么字段...

是否有可能不创建表? (我没有写权限)

回答

7

假设你想加权平均保证金...

Select 
     ... 
     sum(amount*margin)/sum(amount) as 'Weighted Avg' 
     ... 
From ... 
Group By ... 

编辑 - 为了避免可怕的鸿沟被零

case when sum(amount)=0 then null else sum(amount*margin)/sum(amount) end as 'Weighted Avg' 
+0

不错!我被困在试图找出他想用作体重的那一个。 – SqlZim

+0

@SqlZim陪审团仍然不在,OP可能正在寻找总WAM。 –

+0

有时你看不到简单的解决方案-.- 谢谢!!! – Harper