我有下表:
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添加零行的情况下执行此操作?
答案 0 :(得分:1)
您需要创建一个框架表。所以每个日期都有一个标志记录。像
这样的东西SELECT * FROM (SELECT DISTINCT Date From Table) t1, (SELECT DISTINCT Flag From Table) t2;
然后你可以离开加入COALESCE(0),当你分组时你可以使用count来获得记录数。
答案 1 :(得分:0)
您可以这样做:
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