SQL Объединенные таблицы - Несколько строк в объединенной таблице на одно совпавшее поле объединены в одну строку? - PullRequest
3 голосов
/ 24 января 2020

У меня есть две таблицы, из которых я получаю данные. Вот минимальное воссоздание того, что у меня есть:

Select
 Jobs.Job_Number,
 Jobs.Total_Amount,
 Job_Charges.Charge_Code,
 Job_Charges.Charge_Amount
From
 DB.Jobs
Inner Join
 DB.Job_Charges
On
 Jobs.Job_Number = Job_Charges.Job_Number;

Итак, в результате я получаю строку для каждого отдельного Charge_Code и Charge_Amount для Job_Number. Все остальное в ряду одинаковое. Возможно ли, чтобы он возвращал что-то более похожее на:

Job_Number - Total_Amount - Charge_Code[1] - Charge_Amount[1] - Charge_Code[2] - Charge_Amount[2] 

ET C?

Таким образом, он создает одну строку на номер задания с каждым связанным расходом и суммой в одной строке , Я читал W3, но не смог точно сказать, возможно это или нет. Все помогает, спасибо!

1 Ответ

2 голосов
/ 24 января 2020

Чтобы развернуть ваш набор результатов по фиксированному количеству столбцов, вы можете использовать row_number() и условное агрегирование:

select
    job_number, 
    total_amount,
    max(case when rn = 1 then charge_code end) charge_code1,
    max(case when rn = 1 then charge_amount end) charge_amount1,
    max(case when rn = 2 then charge_code end) charge_code2,
    max(case when rn = 2 then charge_amount end) charge_amount2,
    max(case when rn = 3 then charge_code end) charge_code3,
    max(case when rn = 3 then charge_amount end) charge_amount3 
from (
    select
        j.job_number,
        j.total_amount,
        c.charge_code,
        c.charge_amount,
        row_number() over(partition by job_number, total_amount order by c.charge_code) rn
    from DB.Jobs j
    inner join DB.Job_Charges c on j.job_number = c.job_number
) t
group by job_number, total_amount

В приведенном выше запросе передается до 3 кодов начислений и сумм по номеру задания (заказывается рабочие коды). Вы можете расширить предложение select, добавив больше выражений max(case ...) для обработки большего количества из них.

...