SQL 连接表 - 每个 'on' 匹配字段连接表上的多行合并为一行?

标签 sql join group-by pivot window-functions

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

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] 

等等?

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

最佳答案

要将结果集转换为固定数量的列,您可以使用 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 个费用代码和金额(按作业代码排序)。您可以使用更多的 max(case ...) 表达式扩展 select 子句以处理更多的表达式。

关于SQL 连接表 - 每个 'on' 匹配字段连接表上的多行合并为一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59887202/

相关文章:

postgresql - 如何在 PostgreSql 中连接 2 个表而不重复值

sql - PostgreSQL 选择加入不在列表中

mysql - 如果单元格重复,则用新值更新单元格

python - 根据列的计数值的数据框子集

mysql - 寻找一个选项来比较sql文件和csv格式的txt文件的数据

c# - .NET 中的批量 SQL 插入

SQL 连接问题

mysql - 按日期分组,即使没有日期条目

每个子句上带有参数的并集的 SQL View

sql - 每天创建的记录数