我在一对多关系中有两个表“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
答案 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