Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Объединить запрос с таблицей и поместить данные в одну строку / 3 сообщений из 3, страница 1 из 1
24.10.2020, 02:28
    #40011476
rrn_di
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединить запрос с таблицей и поместить данные в одну строку
Здавствуйте!

Есть две таблицы:

Первая:

payments
row_id _id point_id client_id
57095 111-222-333 4 5

Вторая:

payments_attrib

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


Необходимо, чтобы скрипт выводил данные в одну строку подставляя в название столбца данные из второй таблицы (столбец _name)
т.е. такая структура:

+--------+------------+---------+-------+----------+-----------+-----------+
| row_id | payment_id | account | brand | location | payMethod | rtt |
+--------+------------+---------+-------+----------+-----------+-----------+
| 90120 | 57095 | 7077017 | ACT | MST | PAA | 021456668 |
+--------+------------+---------+-------+----------+-----------+-----------+

Данные из второй таблицы развернул скриптом:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT row_id = (SELECT TOP(1) row_id FROM payments_attrib WHERE payment_id = '57095' 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 payments_attrib
WHERE payment_id = '57095'
GROUP BY payment_id;



Как объединить вышеуказанный скрипт со скриптом ниже:

Код: sql
1.
2.
3.
4.
5.
6.
7.
DECLARE @guid as nvarchar(250)
SET @guid= '111-222-333'

Select * From payments_archive
JOIN attr4payments_archive ON(payments.row_id = payments_attrib.payment_id)
WHERE 
_id=@guid 



Чтобы конечный результат был вот такой:

row_id _id point_id client_id account brand location payMethod rtt
57095 111-222-333 4 5 7077017 ACT MST PAA 021456668
...
Рейтинг: 0 / 0
24.10.2020, 09:18
    #40011491
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединить запрос с таблицей и поместить данные в одну строку
rrn_di,

pivot же !
...
Рейтинг: 0 / 0
24.10.2020, 12:22
    #40011520
godsql
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединить запрос с таблицей и поместить данные в одну строку
rrn_di,

не совсем понятно по названиям таблиц, но что мешает запихнуть результаты запроса в подзапрос?
максимально сохранил исходные тексты

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
Create table #payments  (
row_id int,
_id varchar(20),
point_id int, 
client_id int
)
insert into #payments  (row_id, _id, point_id, client_id)
values (57095, '111-222-333', 4, 5)

Create table #payments_attrib (
row_id int,
payment_id int,
_name varchar(20), 
_value varchar(20),
)
insert into #payments_attrib  (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')


DECLARE @guid as nvarchar(250)
SET @guid= '111-222-333'

Select #t.* From #payments
JOIN (
SELECT row_id = (SELECT TOP(1) row_id FROM #payments_attrib WHERE payment_id = '57095' 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 #payments_attrib
WHERE payment_id = '57095'
GROUP BY payment_id
) as #t ON(#payments.row_id = #t.payment_id)
WHERE 
_id=@guid 

drop table #payments_attrib
drop table #payments


...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Объединить запрос с таблицей и поместить данные в одну строку / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]