请教SQL两列多行转换一行两列问题

现有贷款表TABLE,有合同号、担保人姓名、担保人证件号字段,如下图:

img


希望使用sql得到如下的结果

img


一个合同号最多出现10个左右的担保人的行
原来自己用ROW_NUMBER写的还是出现同一合同号多行的情况,思路很乱,希望大伙能帮忙解救一下

WITH cte AS (
  SELECT CONT_NO, GUAR_NAME, GUAR_CERT, 
    ROW_NUMBER() OVER (PARTITION BY CONT_NO ORDER BY GUAR_NAME) AS rn
  FROM TABLE
)
SELECT CONT_NO, 
  MAX(CASE WHEN rn = 1 THEN GUAR_NAME END) AS GUAR_NAME1,
  MAX(CASE WHEN rn = 1 THEN GUAR_CERT END) AS GUAR_
SELECT A.Name,B.Name 
FROM (SELECT Name FROM Table1) AS A, 
     (SELECT Name FROM Table2) AS B

由于你最大可以列10个担保人,所以按最大的来

另外,由于你需要同时将同一条数据多个字段当做整体转到新的行里,所以先行转列一下,再列转行

把需要当做整体的字段拆分到 col 列里,再把 col 列加上序号,最后根据合并序号后的值当做列明转换



with t as (
    select 'ht001' cont_no,'a' guar_name,'a111' guar_cert
    union all select 'ht001','b','b111'
    union all select 'ht002','c','c111'
    union all select 'ht002','d','d111'
    union all select 'ht002','e','e111'
    union all select 'ht002','f','f111'
    union all select 'ht002','g','g111'
)
select * from (
    select cont_no,col+convert(varchar,sn) ncol,val
    from (
        select cont_no
            ,convert(nvarchar(max),guar_name) guar_name
            ,convert(nvarchar(max),guar_cert) guar_cert
            ,row_number() over(partition by cont_no order by guar_name) sn 
            from t

    ) a
    unpivot(val for col in (guar_name,guar_cert)) p
) a
pivot(max(val) for ncol in (guar_name1,guar_cert1,guar_name2,guar_cert2
    ,guar_name3,guar_cert3,guar_name4,guar_cert4,guar_name5,guar_cert5
    ,guar_name6,guar_cert6,guar_name7,guar_cert7,guar_name8,guar_cert8
    ,guar_name9,guar_cert9,guar_name10,guar_cert10
    )) p

img

针对行行转列 列不固定的话,如果强制考虑用sql来处理的话,效率会非常低,建议,业务保存的时候保存你想要的数据,获取通过后端代码进行数据逻辑的组合处理

一定要sql语句解决吗?写个程序解决可以吗?