2012-12-05 40 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