【问题标题】:Displaying a multiple columns in single row in SQL在 SQL 中单行显示多列
【发布时间】:2021-04-07 08:57:01
【问题描述】:
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

我想安排上面的查询得到这样的结果

谢谢

【问题讨论】:

标签: sql sql-server database


【解决方案1】:

您需要以行号为轴。

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

SELECT
    SUB.POLICY_ID
    ,MAX(CASE WHEN POLICY_CONTACT_ROLE_NO = 1 THEN POLICY_CONTACT_ROLE END) AS POLICY_CONTACT_ROLE
    ,MAX(CASE WHEN POLICY_CONTACT_ROLE_NO = 2 THEN POLICY_CONTACT_ROLE END) AS POLICY_CONTACT_ROLE2
    ,MAX(CASE WHEN POLICY_CONTACT_ROLE_NO = 3 THEN POLICY_CONTACT_ROLE END) AS POLICY_CONTACT_ROLE3
    -- etc etc
FROM (
    SELECT *,
        ROW_NUMBER () OVER (PARTITION BY POLICY_ID ORDER BY POLICY_CONTACT_ROLE) AS POLICY_CONTACT_ROLE_NO
    FROM (
        SELECT *
            ROW_NUMBER () OVER (PARTITION BY POLICY_ID, POLICY_CONTACT_ROLE ORDER BY ID ) AS ORDERNO
        FROM P_POL_HEADER_CONTACT
        WHERE POLICY_ID = 20001
    ) SUB
    WHERE SUB.ORDERNO = 1
) SUB
GROUP BY SUB.POLICY_ID

【讨论】:

    【解决方案2】:

    您需要条件聚合。我认为你想要的逻辑是:

    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;
    

    我不确定您对ORDERNO 的过滤实际上在做什么。如果有重复,请使用 DENSE_RANK() 而不是 ROW_NUMBER()。但是,在不知道您的数据是什么样子的情况下,我猜这是不必要的。

    【讨论】:

      【解决方案3】:

      从查询中排除 CONTACT_ID。并使用 STUFF 查询将您的行转换为列

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-11
        • 2013-01-01
        • 1970-01-01
        相关资源
        最近更新 更多