使用Group By Clause时将描述连接在一起

时间:2011-09-08 20:26:05

标签: mysql sql

我在一对多关系中有两个表“acctg_invoice”和“acctg_invoice_item”。所以我可以将多个发票项目链接到一张发票​​。

我需要使用“分组依据”子句将发票项目组合在一起,并使用SUM()函数来添加与发票相关的发票项目金额。因为我使用“分组依据”,“描述”字段仅使用最后一项描述。

在“acctg_invoice_item”中,我存储了项目的“描述”。例如,一个项目可能会说“月租”,另一项可能会说“月度公用事业”,但这两个项目都属于一个“来自父表的”invoice_id“acctg_invoice”。

我想将所有项目“描述”连接成一个长字符串,例如“月租,月工具”等,所以我的最终结果集只有一个显示“金额”的行项目,并且“描述”,但我对如何做到这一点毫无头绪。

这在SQL中是否可行?

我正在使用MySql。提前谢谢!

以下是一个示例SQL语句:

SELECT sum(b.amount_curr) as amount, b.description
FROM acctg_invoice a, acctg_invoice_item b
WHERE a.acctg_invoice_id = b.acctg_invoice_id
GROUP BY a.acctg_invoice_id

3 个答案:

答案 0 :(得分:2)

试试这个:

SELECT 
    SUM(b.amount_curr) amount, 
    GROUP_CONCAT(b.description) descr
FROM acctg_invoice a INNER JOIN acctg_invoice_item b
ON a.acctg_invoice_id = b.acctg_invoice_id
GROUP BY a.acctg_invoice_id

答案 1 :(得分:0)

您可以使用GROUP_CONCAT()聚合函数。这是一个例子:

SELECT
    SUM(b.amount_curr) AS amount,
    GROUP_CONCAT(B.description SEPERATOR ', ') AS description
FROM
    acctg_invoice A
INNER JOIN acctg_invoice_item B ON
    B.acctg_invoice_id = A.acctg_invoice_id
GROUP BY
    A.acctg_invoice_id

GROUP_CONCAT()聚合函数还有其他选项,因此您还可以定义它们应该连接的顺序,等等。{MySQL}网站上提供了The documentation

答案 2 :(得分:0)

请不要使用隐式SQL '89连接语法,这是一种反模式,而是使用显式连接语法 您的查询将更易于维护,调试和理解。

SELECT sum(item.amount_curr) as amount
       , GROUP_CONCAT(item.description) as descriptions
FROM acctg_invoice inv
INNER JOIN acctg_invoice_item item 
        ON (inv.acctg_invoice_id = item.acctg_invoice_id)
GROUP BY inv.acctg_invoice_id WITH ROLLUP

如果您在with rollup条款中添加group by,则会在底部获得总计。

<强>链接
http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat
http://dev.mysql.com/doc/refman/5.0/en/group-by-modifiers.html