SQL Server:加权平均值+ GROUP BY

Har*_*per 4 sql t-sql sql-server

我试图计算SQL Server中的加权平均值.我知道有很多问题可以解决这个问题,但我还有一个额外的问题,我用GROUP BY和sum()和avg()等聚合函数查询了很多其他列.

这是我的查询:

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)
Run Code Online (Sandbox Code Playgroud)

我想可以使用INNER JOIN完全相同的WHERE子句,但我不想执行两次查询.我不知道在哪个领域加入......

没有创建表可以吗?(我没有写权限)

Joh*_*tti 12

假设你想要Weighed Avg Margin ...

Select
       ...
       sum(amount*margin)/sum(amount) as 'Weighted Avg'
       ...
 From  ...
 Group By ...
Run Code Online (Sandbox Code Playgroud)

编辑 - 避免可怕的Divide-by-Zero

case when sum(amount)=0 then null else sum(amount*margin)/sum(amount) end as 'Weighted Avg'
Run Code Online (Sandbox Code Playgroud)