在mysql查询中汇总多个列但只有一个

时间:2013-06-07 16:16:22

标签: php mysql sum rows

好的,我有一个产品表。表名是'orders'。以下是相关栏目:

orders table: ID, Style, Color, XXS, XS, SM, MD, LG, Other

我将提供一个逗号分隔的数字列表,这些数字对应于ID列中的值(它是主键)。

这是挑战。列XXS,XS,SM,MD,LG包含数字。列其他包含文本。每当我们输入订单时,他们都会在这些列中输入数字,然后在最后一列中输入其他内容的文本说明。这是一些示例行:

Style: 2000, Color: RED. XS: 5, MD: 5, Other: Youth 5-L
Style: 2000, Color: RED, XS: 3, L: 15
Style: 2000, Color: RED, Other: Youth 15 XS
Style: 2000, Color: RED, MD: 10, L:10
Style: 2000, Color: BLACK, MD: 15, Other: Youth - 10-L
Style: 2000, Color: BLACK, MD: 20, LG: 25

我需要的是一个查询,按照Style,Then Color对它们进行分组,并对每个列XXS,XS,SM,MD和LG(单独)进行求和,但是从另一列中吐出文本。我还需要按样式排序这个列表,然后是Color。最后,它需要是以逗号分隔的值列表中存在的行列表。这是上表中所需的输出:

Style: 2000, Color: BLACK. MD: 35, LG: 25
Style: 2000, Color: BLACK. Other: Youth - 10-L
Style: 2000, Color: RED. XS: 8, MD: 15, L: 25
Style: 2000, Color: RED. Other: Youth 5-L
Style: 2000, Color: RED. Other: Youth 15 XS

我希望这是有道理的!我们需要将行分开,因为它们是由客户输入的,我们需要准确保留那些订购的内容。

BONUS POINTS如果其他列可以连接成由特殊唯一的字符序列分隔的字符串,如果它的样式和颜色相同(使用| - |作为分隔符)示例如下:

Style: 2000, Color: BLACK. MD: 35, LG: 25, Other: Youth - 10-L<br>
Style: 2000, Color: RED. XS: 8, MD: 15, L: 25, Youth 5-L|-|Youth 15-XS

EDIT !!!!!

我想我很快就说了,并且自己解决了。如果有人好奇,这是有问题的查询。我自己无法回答这个问题超过几个小时。

SELECT SUM(XXS) as XXS, SUM(XS) as XS, SUM(SM) as SM, SUM(MD) as MD, SUM(LG) as LG GROUP_CONCAT(Other SEPARATOR '|-|') as Other, Style, Color
FROM orders
WHERE ID IN(List...)
GROUP BY Style, Color
ORDER BY Style, Color;

此查询根据“样式”和“颜色”中的相似值将所有行组合在一起,将列中的数字与它们相加,并将带有文本的所有列连接在一起,形成可由我的程序解析的格式。

2 个答案:

答案 0 :(得分:0)

只是为了让你接受答案,这是:

SELECT SUM(XXS) as XXS, SUM(XS) as XS, SUM(SM) as SM, SUM(MD) as MD, SUM(LG) as LG GROUP_CONCAT(Other SEPARATOR '|-|') as Other, Style, Color
FROM orders
WHERE ID IN(List...)
GROUP BY Style, Color
ORDER BY Style, Color;

答案 1 :(得分:0)

SELECT
    SUM(XXS) as XXS,
    SUM(XS) as XS,
    SUM(SM) as SM,
    SUM(MD) as MD,
    SUM(LG) as LG
GROUP_CONCAT(Other SEPARATOR '|-|') as Other, Style, Color
FROM orders
WHERE ID IN(List...)
GROUP BY Style, Color
ORDER BY Style, Color;