【问题标题】:Dynamic columns from a LEFT JOIN in SQL ServerSQL Server 中左连接的动态列
【发布时间】:2019-12-18 21:48:52
【问题描述】:

我有一个问题希望你能指导我,我在sql server中有3个表,具有以下特点:

表格发票

ID         Folio
------------------
1          101010
2          202020

表格附加

ID           Name
--------------------------
1            Order Number
2            Branch

表格AdditionalInvoice

ID_INVOICE           ID_ADDITIONAL          VALUE
------------------------------------------------------------
1                    1                      1234/1
1                    2                      NORTH
2                    1                      5678/9
2                    2                      SOUTH

表3依赖表1和表2,比例是一对多,我找如下结果:

查询结果

ID          Folio          Order Number          Branch
------------------------------------------------------------
1           101010         1234/1                NORTH
2           202020         5678/9                SOUTH

调查我可以使用PIVOTCROSS APPLY,但我发现自己有点迷茫:(或者有人对动态列问题有另一种解决方案?

【问题讨论】:

    标签: sql sql-server database pivot-table cross-apply


    【解决方案1】:

    虽然这可以通过PIVOT 和/或CROSS APPLY 完成,但我只会使用条件聚合,这是一种高效且跨数据库的解决方案:

    select
        i.id,
        i.folio,
        max(case when a.name = 'Order Number' then ai.value end) OrderNumber,
        max(case when a.name = 'Branch' then ai.value end) Branch
    from Invoice i
    inner join AdditionalInvoice ai on ai.id_invoice = i.id
    inner join Additional a on a.id = ai.id_additional
    group by i.id, i.folio
    

    注意:重读您的问题,我注意到末尾提到了 dynamic 列。

    请注意,上述查询(或任何其他纯 SQL 解决方案,包括 PIVOTCROSS APPLY)仅适用于 固定 列集。这是因为纯 SQL 查询只能返回一组预定义的固定列。如果你想要一个动态的解决方案,那么你需要动态SQL(即:准备一个查询字符串,然后执行它)。

    另一方面,通过添加max(case when ... then ... end) 表达式,可以轻松扩展上述语句以处理来自additional 表的更多值。

    【讨论】:

    • 非常感谢您的回复,我的朋友,就咨询时间的影响而言,PIVOT、CROSS APPLY 或您提到的解决方案哪个是最佳选择?
    • @Edeveloper:我不希望不同选项之间存在真正的性能差异。条件聚合可能性能稍微好一些,但这应该通过针对您的真实数据的测试来评估。
    • 好朋友,您的解决方案可以解决问题,非常感谢您的帮助。
    • 欢迎@Edeveloper!如果我的回答正确回答了您的问题,请点击检查符号accept it...谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    相关资源
    最近更新 更多