2012-12-05 41 views
3

我的第一篇文章,希望我遵循发布指南的权利。如果没有,请指出。Mysql group_concat从另一行的不同值

我的表结构(credit_notes)与一些样品数据看起来像这样:

index | customer_id | user_id | doc_number | doc_date | amount | scheme_description 
+-----+-------------+---------+------------+------------+--------+------------------- 
1  | 8   | 2  | IABCD001 | 2012-09-08 | 1232 | XYZ Scheme 
2  | 8   | 2  | IABCD001 | 2012-09-08 | 2032 | XYZ Scheme 
3  | 8   | 2  | IABCD002 | 2012-09-09 | 2556 | XYZ Scheme 
4  | 8   | 2  | IABCD003 | 2012-09-08 | 232 | XYZ Scheme 
5  | 8   | 2  | IABCD001 | 2012-09-10 | 2556 | ABC Scheme 
6  | 8   | 2  | IABCD003 | 2012-09-10 | 232 | ABC Scheme 

我的要求是,提取每scheme_description & doc_date组合的总量,与分组。这是我当前的查询:

SELECT 
    SUM(`amount`) AS `totalamount`, 
    GROUP_CONCAT(CONCAT(`amount` , ";") ORDER BY `index` DESC SEPARATOR '') AS `amounts`, 
    GROUP_CONCAT(CONCAT(`doc_number` , ";") ORDER BY `doc_number` DESC SEPARATOR '') AS `docno` , 
    `doc_date` AS `docdate` , 
    `scheme_description` AS `schemedesc` 
FROM (
     SELECT 
      `c`.`index` , 
      `c`.`doc_number` , 
      `c`.`doc_date` , 
      `c`.`amount` , 
      `c`.`scheme_description` 
     FROM `credit_notes` AS `c` 
     WHERE `c`.`customer_id` = 8 
     AND `c`.`user_id` LIKE 2 
)t 
GROUP BY `scheme_description` , `doc_date` 

该查询返回此结构:

totalamount | amounts  | docno      | docdate | schemedesc 
+-----------+----------------+-----------------------------+------------+----------- 
3496  | 1232;2032;232; | IABCD001;IABCD001;IABCD003; | 2012-09-08 | XYZ Scheme 
2556  | 2556;   | IABCD002;     | 2012-09-09 | XYZ Scheme 
23477  | 255;23222;  | IABCD007;IABCD007;   | 2012-09-10 | ABC Scheme 

但是,我需要这一个细微的变化,我想总结的列每个不同docno,并按正确的顺序对其进行分组。因此,按照上述数据,查询应该产生:

totalamount | amounts  | docno      | docdate | schemedesc 
+-----------+----------------+-----------------------------+------------+----------- 
3496  | 3264;232;  | IABCD001;IABCD003;   | 2012-09-08 | XYZ Scheme 
2556  | 2556;   | IABCD002;     | 2012-09-09 | XYZ Scheme 
23477  | 23477;   | IABCD007;     | 2012-09-10 | ABC Scheme 

这可能使用GROUP_CONCAT和独特的和之和。阅读我能找到的所有内容,但找不到任何指向正确方向的内容。

这可能吗?

回答

0

尝试此查询 -

SELECT 
    SUM(amount) totalamount, 
    GROUP_CONCAT(amount) amounts, 
    GROUP_CONCAT(doc_number) docno, 
    doc_date docdate, 
    scheme_description schemedesc 
FROM (
    SELECT scheme_description, doc_date, doc_number, SUM(amount) amount 
    FROM credit_notes 
    GROUP BY scheme_description, doc_date, doc_number) t 
GROUP BY scheme_description, doc_date 

添加的地方,如果需要ORDER BY和其他条款。

+0

啊哈,关键是通过使用两个组声明。非常感谢你。 – deadbeef

+0

是的,是的。因为你第一次需要按三个字段分组,其次是两个字段。 – Devart

+0

如果它是正确的,请接受答案。 – Devart

1

第一个查询可以写成这样:

select 
    doc_date, scheme_description, 
    group_concat(doc_number), 
    group_concat(amount), 
    sum(amount) 
from 
    credit_notes 
group by doc_date, scheme_description 

和你的第二个:

select 
    doc_date, scheme_description, 
    group_concat(doc_number), 
    group_concat(amount), 
    sum(amount) 
from (
    select doc_date, scheme_description, doc_number, sum(amount) as amount 
    from credit_notes 
    group by doc_date, scheme_description, doc_number 
) s 
group by doc_date, scheme_description 
+0

认识到诀窍是使用两组语句。感谢您提供清晰快速的回应。真的很感激它。 – deadbeef

0

尝试此查询

select 
    group_concat(doc_num) as DocNumm, 
    group_concat(amount) as DocNumm, 
    scheme_description as SchemaDesc, 
    sum(amount) as TotalAmount, 
    amount as Amount, 
    doc_date as DocDate 
from (
    SELECT * from `schema` 
) as g 
group by SchemaDesc , DocDate 
+0

感谢您的回复。但是,这还不够,需要使用2组语句,而sum()分两个阶段。其他答案解决了我的问题。 – deadbeef