Как я могу транспонировать строки в столбцы динамически в SQL?

Чтобы дать вам краткое резюме - я хотел бы:

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



Возвращает таблицу, аналогичную приведенной ниже:


| AddressBook # | PhoneType | PhoneAreaCode | Номер телефона |
| ___________ _ _________ _ _____________ _ ___________ |
| 2160 ________ | Cell ______ | 000 __________ | 000-0000 _____ |
| 2160 ________ | Факс ______ | 111 __________ | 111-1111 ______ |
| 2161 ________ | Cell ______ | 222 __________ | 222-2222 _____ |
| 2161 ________ | Факс ______ | 333 __________ | 333-3333 _____ |
| 2162 ________ | Домой ____ | 444__________| 444-4444_____ |


Однако я хотел бы, чтобы возвращаемая таблица выглядела так:


| AddressBook # | PhoneType1 | Телефон № 1 | PhoneType2 | Телефон № 2 | PhoneType3 | Телефон № 3 |
| ___________ _ _________ _ _______ _ _________ _ _________ _ _______ _ _______ |
| 2160 ________ | Cell _______ | 000-0000 | Факс _______ | 111-1111_ | ___________ | ________ |
| 2161 ________ | Cell _______ | 222-2222 | Факс _______ |333-3333 |___________|________|
| 2163 ________ | Главная _____| 444-4444| Факс _______ |333-3333 |___________|________|


Я знаю, что должен динамически преобразовывать свои строки в столбцы... но я не могу понять свой SQL. Какие-либо предложения?

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).

Другие вопросы по тегам