首页 > 解决方案 > SQL Joined Tables - 每个“on”匹配字段的连接表上的多行合并为一行?

问题描述

我有两个要从中提取数据的表。这是我所拥有的最小娱乐:

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;

因此,我最终会为每个 Job_Number 的每个不同 Charge_Code 和 Charge_Amount 获得一行。行中的其他所有内容都相同。是否有可能让它返回更像:

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

ETC?

这样,它为每个作业编号创建一行,每个相关的费用和金额在同一行上。我一直在阅读 W3,但无法确定这是否可能。有什么帮助,谢谢!

标签: sqljoingroup-bypivotwindow-functions

解决方案


要将结果集旋转到固定数量的列,您可以使用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 ...)以处理更多表达式。


推荐阅读