2017-01-09 46 views
0

给你一个简要的总结 - 我想:

1.加入两张表,包含地址簿信息,

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

3.如果第1列中的“地址簿#”重复出现,请让信息出现在同一行(例如,请参阅下文)。如何在SQL中动态地将行转换为列?


下面是表和字段我使用:表1(ABC_F0115)

领域:
'地址簿#'
'电话类型'
“电话区代码'
“电话号码'

表2中的字段(ABC_F0 101):
'地址簿#'
'通讯簿类型'

我现在的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 ________ | Home____ | 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。有什么建议么?

+0

请标注RDMS。没有两种SQL方言是相同的。 – Parfait

回答

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)完成了它。