在SQL中以单行显示多列

在SQL中以单行显示多列,sql,sql-server,database,Sql,Sql Server,Database,我想把上面的查询安排成这样的结果 谢谢从查询中排除联系人ID。并使用STUFF query将行转换为列您需要以行号为中心 您可以使用PIVOT,但我经常发现简单的groupby/MAX更简单,尤其是当您需要重命名列时 选择 次级政策 ,当POLICY\u CONTACT\u ROLE\u NO=1时,最大情况为POLICY\u CONTACT\u ROLE结束为POLICY\u CONTACT\u ROLE ,当策略\联系人\角色\否=2时,则策略\联系人\角色结束为策略\联系人\角色2 ,最大

我想把上面的查询安排成这样的结果


谢谢

从查询中排除联系人ID。并使用STUFF query将行转换为列

您需要以行号为中心

您可以使用PIVOT,但我经常发现简单的groupby/MAX更简单,尤其是当您需要重命名列时

选择 次级政策 ,当POLICY\u CONTACT\u ROLE\u NO=1时,最大情况为POLICY\u CONTACT\u ROLE结束为POLICY\u CONTACT\u ROLE ,当策略\联系人\角色\否=2时,则策略\联系人\角色结束为策略\联系人\角色2 ,最大情况下,当策略\u联系人\u角色\u编号=3时,策略\u联系人\u角色结束为策略\u联系人\u角色3 -等等 从…起 选择*, 按策略分区上的行数\u ID按策略排序\u联系人\u角色作为策略\u联系人\u角色\u编号 从…起 挑选* 按策略ID划分的分区上的行号,策略联系人角色按ID排序作为订单号 来自P_POL_HEADER_联系人 其中POLICY_ID=20001 附属的 其中SUB.ORDERNO=1 附属的 按子策略\u ID分组
您需要条件聚合。我认为你想要的逻辑是:

SELECT * FROM 
(select ID,POLICY_ID,CONTACT_ID,POLICY_CONTACT_ROLE,ROW_NUMBER () OVER (PARTITION  BY POLICY_ID,POLICY_CONTACT_ROLE ORDER BY ID ) AS ORDERNO
FROM P_POL_HEADER_CONTACT ) SUB
WHERE SUB.ORDERNO=1 AND POLICY_ID =20001

我不确定你对ORDERNO的过滤到底在做什么。如果有重复项,请使用密集排列而不是行数。但是,在不知道您的数据是什么样子的情况下,我猜这是不必要的。

请不要使用图像-使用格式化文本。为什么有两列“政策联系人”栏?这是否回答了您的问题?
SELECT PCH.POLICY_ID,
       MAX(CASE WHEN SEQNUM = 1 THEN POLICY_CONTACT_ROLE END) as POLICY_CONTACT_ROLE_1,
       MAX(CASE WHEN SEQNUM = 2 THEN POLICY_CONTACT_ROLE END) as POLICY_CONTACT_ROLE_2,
       MAX(CASE WHEN SEQNUM = 3 THEN POLICY_CONTACT_ROLE END) as POLICY_CONTACT_ROLE_3
FROM (SELECT PHC.*,
             ROW_NUMBER() OVER (PARTITION  BY POLICY_ID ORDER BY ID ) AS SEQNUM
      FROM P_POL_HEADER_CONTACT PHC
     ) PHC
WHERE POLICY_ID = 20001
GROUP BY POLICY_ID;