我只想对一列的行使用分组依据,让我解释一下如何操作。
我的查询:-
SELECT
m.name AS brand,
opv.name AS model,
opv.product_condition AS condition,
(AVG(opv.final_price + opv.overhead_cost)) AS cost,
opv.product_color AS color,
COUNT(m.name) as quantity
FROM `order` o
JOIN order_veri AS ov
ON o.order_id = ov.order_fk
JOIN order_prod_veri AS opv
ON ov.order_fk = opv.order_id
JOIN product AS p
ON opv.product_id = p.product_id
JOIN manufacturer AS m
ON p.manufacturer_id = m.manufacturer_id
GROUP BY model,
product_condition
这是我得到的数据:-
Brand | Model | Cost | Condition | Color | Quantity
-------------------------------------------------------
Apple | iPhone 5 | $50.95 | Used | Black | 2
Blackberry | Blackberry 9900 | $22.98 | Used | Black | 2
Samsung | Galaxy S | $16.92 | Used | White | 2
HTC | Rhyme | $60.42 | New | Red | 2
Google | Google Nexus | $72.24 | New | Blue | 2
Motorola | Razr | $9.68 | Used | Silver | 2
Apple | iPad Air | $2.74 | New | Silver | 1
这就是我想要获取数据的方式(或者我希望它如何显示):-
Brand | Model | Cost | Condition | Color | Quantity
-------------------------------------------------------
Apple | iPhone 5 | $50.95 | Used | Black | 2
Apple | iPhone 5 | $50.95 | Used | White |
Blackberry | Blackberry 9900 | $22.98 | Used | Black | 3
Blackberry | Blackberry 9900 | $22.98 | Used | White |
Blackberry | Blackberry 9900 | $22.98 | Used | Black |
HTC | Rhyme | $60.42 | New | Red | 2
HTC | Rhyme | $60.42 | New | Black |
Google | Google Nexus | $72.24 | New | Blue | 2
Google | Google Nexus | $72.24 | New | Black |
Motorola | Razr | $9.68 | Used | Silver | 2
Motorola | Razr | $9.68 | Used | White | 2
Apple | iPad Air | $2.74 | New | Silver | 1
请注意价格如何保持不变,但现在根据数量显示了额外的行,显示相同型号的属性。
我想在这里实现什么:-
现在在颜色列中,由于分组,我没有得到每个模型的不同颜色变化。例如,第一行中 iPhone 5 的数量为 5,但它仅显示这 5 中第一台的颜色。
同样,第二行型号是Blackberry 9900,数量为2个,但由于分组时只显示其中1个的颜色有两种不同的颜色(白色和黑色)。
所以我想问的是,是否可以使用 GROUP BY 仅对成本进行分组?
如果您想澄清一些事情或对我想要实现的目标提供更好的解释,请告诉我。
最佳答案
从你的问题中并不清楚你想做什么。很明显,您正在使用令人困惑的非标准 MySQL 扩展 GROUP BY
。您应该阅读 MySQL 手册的这一部分。
http://dev.mysql.com/doc/refman/5.5/en/group-by-extensions.html
关于 SQL 需要记住的一点是,任何问题的困难部分都是精确指定您想要的结果集。
您在评论中说过,您希望显示库存的详细列表,即库存中每个不同的商品占一行。但在该详细列表中,您希望显示该品牌、型号和状况的库存中所有商品的平均成本。这在 SQL 中很棘手,因为您要混合苹果(详细信息)和 Orchard (平均值)。
为此,您需要一个子查询和一个联接。子查询计算出您的平均成本。是这样的:
SELECT m.name AS brand,
opv.name AS model,
opv.product_condition AS product_condition,
AVG(opv.final_price + opv.overhead_cost) AS cost
FROM ... the tables in your original ...
JOIN ... query in your question.
GROUP BY brand, model, product_condition
然后您需要将此子查询视为虚拟表,并将其连接到您的主查询,如下所示。
SELECT m.name AS brand,
opv.name AS model,
opv.product_condition AS product_condition,
avg.cost,
opv.product_color AS color
FROM ... the tables in your original ...
JOIN ... query in your question.
JOIN ... in your question
JOIN (
SELECT m.name AS brand,
opv.name AS model,
opv.product_condition AS product_condition,
(AVG(opv.final_price + opv.overhead_cost)) AS cost
FROM ... the tables in your original
JOIN ... query in your question.
GROUP BY brand, model, product_condition
) AS avg ON ( m.name=avg.name
AND opv.name = avg.model
AND opv.product_condition = avg.product_condition)
现在,这看起来像是一个可怕的令人讨厌的查询。从某种意义上来说确实如此,因为您的规范有时需要详细记录,有时需要平均值。但你不应该担心性能;这将是相当不错的。请注意,子查询中有一个 GROUP BY 子句,因为它正在计算平均值。但主查询中没有这样的子句,因为它呈现的是详细记录(单个项目)。
如果您只是寻找汇总结果,您可以有多种选择。如果您试图单独显示不同颜色和条件的元素的平均成本。在这种情况下你想要
SELECT m.name AS brand,
opv.name AS model,
opv.product_condition AS product_condition,
AVG(opv.final_price + opv.overhead_cost) AS cost,
opv.product_color AS color,
FROM ...
JOIN ...
GROUP BY brand, model, product_condition, color
但也许您想显示商品的平均价格,无论颜色如何。在这种情况下你想要
SELECT m.name AS brand,
opv.name AS model,
opv.product_condition AS product_condition,
AVG(opv.final_price + opv.overhead_cost) AS cost,
GROUP_CONCAT (opv.product_color) AS color,
FROM ...
JOIN ...
GROUP BY brand, model, product_condition
您是否看到 SELECT ... GROUP BY
中的每个项目在 SELECT
和 GROUP BY
中都被提及,或者受到影响到 SELECT
中的汇总函数(SUM
、GROUP_CONCAT
)?这是 GROUP BY
的标准工作方式。
关于mysql - 仅针对一列的行进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20204658/