【问题标题】:How do I transpose rows into columns dynamically in SQL?如何在 SQL 中动态地将行转换为列?
【发布时间】:2017-05-24 05:59:01
【问题描述】:

给你一个简短的总结——我想:

1. 连接两个包含通讯簿信息的表,

2. 连接“电话号码区号”和“电话号码”(因为它们存储在我们数据库中的不同列中)

3. 如果第 1 列中的“地址簿#”重复 - 让信息出现在同一行(例如,见下文) .


以下是我正在使用的表格和字段:

表 1 (ABC_F0115) 中的字段:
‘通讯录#’
“手机类型”
‘电话区号’
“电话号码”

表 2 (ABC_F0101) 中的字段:
‘通讯录#’
‘通讯录类型’

我当前的 SQL 是:

SELECT WPAN8 'Address Book#', WPPHTP 'Phone Type', WPAR1 'Phone Area Code', WPPH1 'Phone Number', ABAT1 'Address Book concat('(',LTRIM(RTRIM(WPAR1)),')', ' ', WPPH1) AS 'Full Phone Number' FROM ABC.F0101 JOIN ABC.F0115 ON WPAN8=ABAN8 WHERE ABAT1='AR';



它返回一个类似于下面的表:


|通讯录#|电话类型 |电话区号 |电话号码 |
|___________ _ _________ _ _____________ _ ___________|
|2160________|细胞______| 000__________| 000-0000_____ |
|2160________|传真______ | 111______________| 111-1111______ |
|2161________|细胞______|第222章222-2222_____ |
|2161________|传真______ |第333章333-3333_____ |
|2162________|主页____ |第444章444-4444_____ |


但是,我希望返回的表格如下所示:


|通讯录#|电话类型1 |电话#1 |电话类型2 |电话#2 |电话类型3 |电话#3 |
|___________ _ _________ _ _______ _ _________ _ _________ _ _______ _ _______ |
|2160________|细胞______| 000-0000|传真_______ |111-1111_|___________|________|
|2161________|细胞______| 222-2222|传真 _______ |333-3333 |___________|________|
|2163________|主页_____| 444-4444|传真 _______ |333-3333 |___________|________ |


我知道我必须动态地将我的行转换为列...但我无法完全弄清楚我的 SQL。有什么建议吗?

【问题讨论】:

  • 请标记 RDMS。没有两种 SQL 方言是相同的。

标签: sql multiple-columns dynamic-sql transpose rdbms


【解决方案1】:

我猜这是你锁定的东西?

WITH Result AS (
    SELECT
        WPAN8,
        WPPHTP,
        WPPH1 'Phone Number',
        ROW_NUMBER() OVER (PARTITION BY WPAN8, ORDER BY WPPHTP,WPPH1) AS CallRowNumber
    FROM ABC.F0101
    JOIN ABC.F0115 ON WPAN8=ABAN8
    WHERE ABAT1='AR';
)
SELECT
    WPAN8 'Address Book#',
    Resutl1.WPPHTP AS 'Phone Type1',
    Resutl1.WPPH1 'Phone Number1',
    Resutl2.WPPHTP AS 'Phone Type2',
    Resutl2.WPPH1 'Phone Number2',
    Resutl3.WPPHTP AS 'Phone Type3',
    Resutl3.WPPH1 'Phone Number3',
FROM ABC.F0101
LEFT JOIN Result AS Resutl1 ON Resutl1.WPAN8=ABAN8 AND CallRowNumber = 1
LEFT JOIN Result AS Resutl2 ON Resutl2.WPAN8=ABAN8 AND CallRowNumber = 2
LEFT JOIN Result AS Resutl3 ON Resutl3.WPAN8=ABAN8 AND CallRowNumber = 3

由于我不知道您使用的是哪种 SQL 语法,所以我使用 SQL Server (TSQL) 来完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    相关资源
    最近更新 更多