Как я могу транспонировать строки в столбцы динамически в 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).