具有缺失行的日期的SQL加权平均值

时间:2015-08-10 16:57:32

标签: sql weighted-average

我有下表:

    Date | Flag|  Val   |  Weight
      1  |  A  |    5   |    2    
      1  |  B  |    5   |    2    
      2  |  A  |    10  |    1     
      3  |  A  |    10  |    1
      3  |  B  |    10  |    1

如果按照Flag列进行SUM(val * weight)/ SUM(weight)分组,那么我将得到A:7.5,B:6.67。但是,这是因为第二个日期没有B的条目。我想将其视为零值。所以我真的应该得到A:7.5,B:5。

如何在不修改表格并为B添加零行的情况下执行此操作?

2 个答案:

答案 0 :(得分:1)

您需要创建一个框架表。所以每个日期都有一个标志记录。像

这样的东西
SELECT * FROM (SELECT DISTINCT Date From Table) t1, (SELECT DISTINCT Flag From Table) t2;

然后你可以离开加入COALESCE(0),当你分组时你可以使用count来获得记录数。

答案 1 :(得分:0)

基于Brad answer

您可以这样做:

CREATE TABLE tbValues (`Date` int, `Flag` char, `Val` float, `Weight` float);

INSERT INTO tbValues
    SELECT 1, 'A',  5, 2 UNION
    SELECT 1, 'B',  5, 2 UNION
    SELECT 2, 'A', 10, 1 UNION
    SELECT 3, 'A', 10, 1 UNION
    SELECT 3, 'B', 10, 1 ;

CREATE TABLE tbTemp
as (SELECT * FROM (SELECT DISTINCT Date, Weight From tbValues) t1, (SELECT DISTINCT Flag From tbValues) t2);

然后:

SELECT 
    SUM( IFNULL(V.Val,0) * IFNULL(T.Weight,0) ) / SUM( T.Weight ) 
FROM tbValues V
RIGHT JOIN tbTemp T
    ON V.Date = T.Date
    AND V.Flag = T.Flag
GROUP BY
    T.Flag;

这里有一个实例: SqlFiddle