SQL получает столбец в виде значений, разделенных запятыми, из подзапроса - PullRequest
0 голосов
/ 03 июля 2018

У меня есть эти таблицы в моем postresql: -
1. Оплата (id, номер, сумма)
2. Счет (id, номер, сумма)
и таблица invoice_payment для распределения суммы платежей по счетам
3. InvoicePayment (id, payment_id, invoice_id, сумма)
Единый платеж можно отнести ко многим счетам. Теперь мне нужны детали платежа, но я также хочу invoices.number счетов, на которые этот платеж выделен. Я делаю что-то вроде этого: -

SELECT
    payments.number,
    payments.amount,
    (SELECT invoices.number from invoices INNER JOIN invoice_payments
     ON invoices.id = invoice_payments.invoice_id
     WHERE invoice_payments.payment_id = payments.id)
from payments

Но это дает мне ошибку более чем в одной строке, возвращенной подзапросом. Как сделать так, чтобы номер счета-фактуры был разделен запятыми для каждой строки платежей? Пример данных: -

Payment  
id  number  amount  
1  "Pay001" 100  
2 "Pay002" 150  
3 "Pay003" 150 
Invoice  
id number amount  
1 "INV001" 100  
2 "INV002" 200  
3 "INV003"  100  
InvoicePayment  
id payment_id invoice_id amount  
1    1          1          50  
2    1          2          50  
3    2          2          150  
4    3          1           50  
5    3          3          100  

Result:-  

payment_id payment_number amount invoices  
1          "Pay001"       100    "INV001, INV002"  
2          "Pay002"       150    "INV002"  
3          "Pay003"       150    "INV001, INV002"

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

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

SELECT
    payments.number,
    payments.amount,
    inv_p.inv_no
from payments p inner join (Select invoice_payments.payment_id, string_agg(invoices.number,',') as inv_no
                            From invoices inner join invoice_payments on (invoices.id = invoice_payments.invoice_id)
                            Group by invoice_payments.payment_id) inv_p on (p.id = inv_p.payment_id)
0 голосов
/ 03 июля 2018

Вы можете использовать функцию string_agg в postgres для объединения строк, разделенных выбранным разделителем.

SELECT
    payments.number,
    payments.amount,
    (SELECT string_agg(invoices.number,',') from invoices INNER JOIN invoice_payments
     ON invoices.id = invoice_payments.invoice_id
     WHERE invoice_payments.payment_id = payments.id)
from payments
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...