【问题标题】:Combining rows dynamically in sql [closed]在sql中动态组合行[关闭]
【发布时间】:2020-09-05 22:11:16
【问题描述】:

我知道有类似措辞的问题,但我似乎找不到适合我具体情况的问题。我有一些或多或少看起来像这样的东西:

GUID  | FIRST_NAME | LAST_NAME | LOAN_NUMBER | LOAN_AMOUNT
---------------------------------------------------------
0001  | FIRST      | LAST      | 01          | 1000
0001  | FIRST      | LAST      | 02          | 1500
0002  | SECOND     | PERSON    | 03          | 1250
0002  | SECOND     | PERSON    | 04          | 2000
0002  | SECOND     | PERSON    | 05          | 1250

等等(任何人都可以有不同数量的不同金额的不同贷款)......

我需要它看起来像这样:

GUID | FIRST_NAME | LAST_NAME | LOAN_AMOUNT1 | LOAN_AMOUNT2 | LOAN_AMOUNT3
--------------------------------------------------------------------------
0001 | FIRST      | LAST      | 1000         | 1500         |
0002 | SECOND     | PERSON    | 1250         | 2000         | 1250

无论如何,这个 sql 结果最终都会被传递到 C# 应用程序中,所以如果这在 c# 中更容易完成,那么我可能会改用这条路线。

【问题讨论】:

    标签: c# sql group-by pivot window-functions


    【解决方案1】:

    您可以使用row_number() 对每个人的贷款进行排名,然后使用条件聚合进行透视:

    select
        guid,
        first_name,
        last_name,
        max(case when rn = 1 then loan_amount end) loan_amount1,
        max(case when rn = 2 then loan_amount end) loan_amount2,
        max(case when rn = 3 then loan_amount end) loan_amount3
    from (
        select 
            t.*,
            row_number() over(partition by guid order by loan_number) rn
        from mytable t
    ) t
    group by guid, first_name, last_name
    

    如果您需要每人处理超过 3 笔贷款,您可以使用更多条件表达式扩展 select 子句。

    【讨论】:

    • 啊,效果很好!我在 SQL 方面还比较缺乏经验,之前甚至没有见过 row_number 的东西,非常感谢!
    猜你喜欢
    • 2015-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    • 2012-12-04
    • 1970-01-01
    • 2013-05-24
    相关资源
    最近更新 更多