Объединение описания вместе при использовании предложения Group By - PullRequest
0 голосов
/ 09 сентября 2011

У меня есть две таблицы "acctg_invoice" и "acctg_invoice_item" в отношении 1 ко многим. так что я могу иметь несколько элементов счета, связанных с одним счетом.

Мне нужно использовать предложение «Группировать по», чтобы сгруппировать элементы счета-фактуры, и функцию 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 ]

2 голосов
/ 09 сентября 2011

Попробуйте это:

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
0 голосов
/ 09 сентября 2011

Пожалуйста, не используйте неявный синтаксис соединения 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

0 голосов
/ 09 сентября 2011

Для этого вы можете использовать агрегатную функцию 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...