使用group by获取按名称销售的产品数量

时间:2016-01-25 20:18:05

标签: mysql mysqli

我有类似的表格:

function filterByClassId(schools, id){
    return schools.filter(function(school){
        return school.classes.some(function(c){
            return c.classId === id;
        });
    });
}

具有相似的值(名称字段中的随机字符)

CREATE TABLE ForgeRock
    (`id` int, `name` varchar(100), `price` decimal(10,2),`soldtime` datetime)
;

现在,我正试图通过以下方式获得每个销售产品的数量:

INSERT INTO ForgeRock
    (`id`, `name`, `price`,`soldtime`)
VALUES
    (1, 'OpenIDM..', 10,'2015-10-11'),
    (2, 'OpenAM....', 20,'2016-1-9'),
    (3, 'OpenDJ...', 30,'2010-1-1'),
    (2, 'OpenAM...', 20,'2016-12-9'),
    (2, 'OpenAM.....', 20,'2016-11-9'),
    (2, 'OpenDJ...', 20,'2016-10-9')
;

但是我得到随机结果(大多数产品都缺失了)。 我认为这是由于对组的限制,所有非聚合列必须是group by的一部分。什么是替代解决方案?

感谢。

1 个答案:

答案 0 :(得分:1)

既然你只想要产品和数量,你应该只询问产品和数量而不是" *"

SELECT name, count(*) AS sc FROM ForgeRock GROUP BY name

如果你想要更多" group"数据,例如平均价格,将其添加到所选项目列表中:

SELECT name, count(*) AS sc, avg(price) AS ap 
FROM ForgeRock 
GROUP BY name

如果您需要其他非组数据,还需要将其添加到GROUP BY子句

SELECT name, DATE(soldtime), count(*) AS sc, avg(price) AS ap 
FROM ForgeRock 
GROUP BY name, DATE(soldtime)

这将按天计算您的计数和平均价格。