如何在SQL中动态地将行转换为列?

时间:2017-01-09 21:15:37

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

  

为了给你一个简短的总结 - 我想:
加入两张包含地址簿信息的表格,

。连接'电话号码区'代码'和'电话号码'(因为它们存储在我们数据库的不同列中)

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';



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

|通讯录#| PhoneType | PhoneAreaCode |电话号码|
| ___________ _ _________ _ _____________ _ ___________ |
| 2160 ________ |细胞______ | 000 __________ | 000-0000 _____ |
| 2160 ________ | Fax______ | 111 __________ | 111-1111 ______ |
| 2161 ________ |细胞______ | 222 __________ | 222-2222 _____ |
| 2161 ________ | Fax______ | 333 __________ | 333-3333 _____ |
| 2162 ________ |回家_____ 444 __________ | 444-4444 _____ |

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

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

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

1 个答案:

答案 0 :(得分:0)

我想这是你要锁定的东西吗?

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)进行了此操作。