mysql group_concat и группа не работает - PullRequest
0 голосов
/ 04 марта 2020

У меня есть следующие две таблицы (упрощенно):

tblinvoices

id  dateCreated    

1   2020-01-02
2   2020-01-03
3   2020-01-03
4   2020-01-04

tblinvoicesLines

id invoiceId vatId vatAmount
1  4         7     35.50
2  4         8     15.75
3  4         7     11.50
3  5         7     10.05
4  6         7     11.04

Я пытаюсь агрегировать результаты vatAmount в выводе, как в этом примере:

invoiceId   listVatAmounts
4          47.00,15.75
5          10.05
6          11.04

У меня следующий запрос mysql:

select
tblInvoices.id as invoiceId,

(
select group_concat(vatAmount) from tblinvoicesLines
where tblinvoicesLines.invoiceId=tblInvoices.id
group by tblinvoicesLines.vatId
) as listVatAmounts

from tblInvoices
order by id desc
limit 10

Я надеялся group by tblinvoicesLines.vatId будет группировать эти значения вместе, но mysql возвращает ошибку:

Подзапрос возвращает более 1 строки

Что может Я делаю, чтобы достичь желаемого результата? Я хочу, чтобы это было достигнуто с помощью подзапроса.

Ответы [ 3 ]

1 голос
/ 04 марта 2020

Сначала нужно выполнить суммы на vatId, а затем вы можете перечислить суммы vatAmount на invoiceId:

SELECT invoiceId, GROUP_CONCAT(sumVatAmounts) AS listVatAmounts
FROM (SELECT invoiceId, vatId, SUM(vatAmount) AS sumVatAmounts
      FROM tblinvoicesLines
      GROUP BY invoiceId, vatId) t
GROUP BY invoiceId

Вывод:

invoiceId   listVatAmounts
4           47.00,15.75
5           10.05
6           11.04

Если вам нужно включить значения из tblInvoices, вы можете просто JOIN эту таблицу к вышеуказанному запросу в качестве производной таблицы:

SELECT i.id AS invoiceId, i.dateCreated, GROUP_CONCAT(t.sumVatAmounts) AS listVatAmounts
FROM tblInvoices i
LEFT JOIN (SELECT invoiceId, vatId, SUM(vatAmount) AS sumVatAmounts
           FROM tblinvoicesLines
           GROUP BY invoiceId, vatId) t ON t.invoiceId = i.id
GROUP BY i.id, i.dateCreated

Или, если вам действительно нужно использовать подзапрос:

SELECT i.id AS invoiceId,
       (SELECT GROUP_CONCAT(sumVatAmounts)
        FROM (SELECT invoiceId, vatId, SUM(vatAmount) AS sumVatAmounts
              FROM tblinvoicesLines
              GROUP BY invoiceId, vatId) t
        WHERE t.invoiceId = i.id) AS listVatAmounts
FROM tblInvoices i

Демонстрация на dbfiddle

0 голосов
/ 04 марта 2020

Я сделал следующее:

select
@invoiceId:= tblInvoices.id as invoiceId,

(
select group_concat(vatAmount)
from
(
select sum(vatAmount) as vatAmount
from tblinvoicesLines
where tblinvoicesLines.invoiceId=@invoiceId
group by tblinvoicesLines.vatId
) t
)

as listVatAmounts

from tblInvoices
order by id desc
limit 10

Но производительность не очень хорошая. Однако это делается в одном подзапросе

0 голосов
/ 04 марта 2020

Вы также можете сделать это с одним SELECT следующим образом:

SELECT  invoiceId, CONCAT(
    SUM(IF(vatId=7,vatAmount,0))
    ,if( SUM(IF(vatId=8,vatAmount,0)) >0
        , CONCAT(',',SUM(IF(vatId=8,vatAmount,0)))
        ,'')
    ) AS listVatAmounts
FROM invoiceId
GROUP BY invoiceId;

ИЛИ с подзапросом и для всех invoiceIds

SELECT
    invoiceId,
    GROUP_CONCAT(vatAmount ORDER BY vatId SEPARATOR ', ') AS listVatAmounts
FROM (
    SELECT id, invoiceId, vatId, SUM(vatAmount) as vatAmount
    FROM invoiceId
    GROUP BY invoiceId,vatId
    ) grp
GROUP BY invoiceId
ORDER BY id;

Sample

MariaDB [bernd]> SELECT  invoiceId, CONCAT(
    ->     SUM(IF(vatId=7,vatAmount,0))
    ->     ,if( SUM(IF(vatId=8,vatAmount,0)) >0
    ->         , CONCAT(',',SUM(IF(vatId=8,vatAmount,0)))
    ->         ,'')
    ->     ) AS listVatAmounts
    -> FROM invoiceId
    -> GROUP BY invoiceId;
+-----------+----------------+
| invoiceId | listVatAmounts |
+-----------+----------------+
|         4 | 47.00,15.75    |
|         5 | 10.05          |
|         6 | 11.04          |
+-----------+----------------+
3 rows in set (0.01 sec)

MariaDB [bernd]>

Образец 2

MariaDB [bernd]> SELECT
    ->     invoiceId,
    ->     GROUP_CONCAT(vatAmount ORDER BY vatId SEPARATOR ', ') AS listVatAmounts
    -> FROM (
    ->     SELECT id, invoiceId, vatId, SUM(vatAmount) as vatAmount
    ->     FROM invoiceId
    ->     GROUP BY invoiceId,vatId
    ->     ) grp
    -> GROUP BY invoiceId
    -> ORDER BY id;
+-----------+----------------+
| invoiceId | listVatAmounts |
+-----------+----------------+
|         4 | 47.00, 15.75   |
|         5 | 10.05          |
|         6 | 11.04          |
+-----------+----------------+
3 rows in set (0.00 sec)

MariaDB [bernd]>
...