Вывести данные в одну строку и указать названия столбцов из значения строки
Есть скрипт:
SELECT * FROM payments
where payment_id = '57095'
Результат вывода:
row_id payment_id _name _value
90120 57095 account 7077017
90122 57095 brand ACT
90121 57095 location MST
90123 57095 payMethod PAA
90124 57095 rtt 021456668
Каким образом можно изменить select, чтобы результатом стала такая структура?
row_id payment_id account brand location payMethod rtt
90120 57095 7077017 ACT MST PAA 021456668
Ответы (1 шт):
Автор решения: Yitzhak Khabinsky
→ Ссылка
Пожалуйста, попробуйте следующий метод.
SQL Server 2005 и новее.
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (row_id INT, payment_id INT, _name VARCHAR(30), _value VARCHAR(30));
INSERT INTO @tbl (row_id, payment_id, _name, _value) VALUES
(90120, 57095, 'account', '7077017'),
(90122, 57095, 'brand', 'ACT'),
(90121, 57095, 'location', 'MST'),
(90123, 57095, 'payMethod', 'PAA'),
(90124, 57095, 'rtt', '021456668');
-- DDL and sample data population, end
DECLARE @payment_id INT = 57095;
SELECT row_id = (SELECT TOP(1) row_id FROM @tbl WHERE payment_id = @payment_id ORDER BY row_id)
, payment_id
, MAX(CASE WHEN _name = 'account' THEN _value ELSE '' END) [account]
, MAX(CASE WHEN _name = 'brand' THEN _value ELSE '' END) [brand]
, MAX(CASE WHEN _name = 'location' THEN _value ELSE '' END) [location]
, MAX(CASE WHEN _name = 'payMethod' THEN _value ELSE '' END) [payMethod]
, MAX(CASE WHEN _name = 'rtt' THEN _value ELSE '' END) [rtt]
FROM @tbl
WHERE payment_id = @payment_id
GROUP BY payment_id;
Output
+--------+------------+---------+-------+----------+-----------+-----------+
| row_id | payment_id | account | brand | location | payMethod | rtt |
+--------+------------+---------+-------+----------+-----------+-----------+
| 90120 | 57095 | 7077017 | ACT | MST | PAA | 021456668 |
+--------+------------+---------+-------+----------+-----------+-----------+