Я использую SQL Server 2012 и пытаюсь «повернуть» строки в столбцы для каждого ключа.
Максимальное количество строк в наборе — 4.
Я подготовил пример кода, чтобы лучше его описать.
DECLARE @resu TABLE
(
header_id numeric(10, 0) null,
appointment_id numeric(10, 0) null,
client_id numeric(10, 0) null,
on_date datetime null,
on_time char(5) null,
room_id numeric(10, 0) null
)
INSERT @resu
SELECT 654661,2784760,232834, '2023-04-17 00:00:00.000','13:00',9
INSERT @resu
SELECT 654661,2784761,232845, '2023-04-17 00:00:00.000','13:00',9
INSERT @resu
SELECT 654661,2784762,232836, '2023-04-17 00:00:00.000','13:00',9
INSERT @resu
SELECT 654661,2784763,232837, '2023-04-18 00:00:00.000','13:00',9
INSERT @resu
SELECT 654662,2784798,232888, '2023-04-18 00:00:00.000','15:00',9
INSERT @resu
SELECT 654662,2784799,232889, '2023-04-18 00:00:00.000','15:00',9
select * from @resu
Результат, который я пытаюсь получить,
--header_id then the client_ids order by appointment_id and then the on_date, on_time, room_id which are common for all these records
--the max rows per header_id is 4
header_id,client_id1,client_id2,client_id3,client_id4,on_date,on_time,room_id
654661,232834,232845,232836,232837,'2023-04-17 00:00:00.000','13:00',9
654662,232888,232889,null,null,'2023-04-18 00:00:00.000','15:00',9
Я пробовал это stackoverflow.com/questions/15745042/… и stackoverflow.com/questions/15931607/…, но мой случай совершенно другой.
Если вы храните on_date
и on_time
отдельно — почему бы вам не использовать DATE
для on_date
и TIME
для on_time
? Зачем использовать строковый тип для вашего on_time
??? Эти правильные типы данных доступны начиная с SQL Server 2008.....
Итак, еще раз, в чем ваш вопрос, логика, попытка, причина неудачи и непонимания?
Элегантный способ сделать это вместо создания 4 блоков IF.
и курсор...
К вашему сведению, срок службы SQL Server 2012 истек около 2 лет назад; вам действительно необходимо реализовать свой путь обновления, чтобы перейти на полностью поддерживаемую версию SQL Server.
@marc_s К сожалению, база данных существовала раньше. Это пример кода.
если ваши данные верны
CREATE TABLE resu
(
header_id numeric(10, 0) null,
appointment_id numeric(10, 0) null,
client_id numeric(10, 0) null,
on_date datetime null,
on_time char(5) null,
room_id numeric(10, 0) null
)
INSERT INTO resu
(header_id,appointment_id, client_id ,on_date ,on_time,room_id )
VALUES
(654661,2784760,232834, '2023-04-17 00:00:00.000','13:00',9),
(654661,2784761,232845, '2023-04-17 00:00:00.000','13:00',9),
(654661,2784762,232836, '2023-04-17 00:00:00.000','13:00',9),
(654661,2784763,232837, '2023-04-18 00:00:00.000','13:00',9),---error---
(654662,2784798,232888, '2023-04-18 00:00:00.000','15:00',9),
(654662,2784799,232889, '2023-04-18 00:00:00.000','15:00',9);
используйте pivot
,concat
, max
и row_number
вместе
SELECT header_id,
MAX([client_id1]) client_id1,
MAX([client_id2]) client_id2,
MAX([client_id3] )client_id3 ,
MAX([client_id4] )client_id4 ,
MIN(on_date ) on_date,
MIN(on_time) on_time,
MIN(room_id) room_id
FROM (
select header_id,
[client_id1],
[client_id2],
[client_id3],
[client_id4],
on_date ,
on_time,
room_id
from
(
select header_id,
client_id ,
CONCAT('client_id',ROW_NUMBER() OVER ( PARTITION BY header_id ORDER BY appointment_id,on_date, on_time, room_id)) PT,
on_date ,
on_time,
room_id
from resu
) src
pivot
(
MAX(client_id)
for PT in ([client_id1], [client_id2], [client_id3], [client_id4])
) piv
)
A
GROUP BY header_id
однако я думаю, что ваши входные данные на сайте содержат ошибки и корректируя данные
CREATE TABLE resu
(
header_id numeric(10, 0) null,
appointment_id numeric(10, 0) null,
client_id numeric(10, 0) null,
on_date datetime null,
on_time char(5) null,
room_id numeric(10, 0) null
)
INSERT INTO resu
(header_id,appointment_id, client_id ,on_date ,on_time,room_id )
VALUES
(654661,2784760,232834, '2023-04-17 00:00:00.000','13:00',9),
(654661,2784761,232845, '2023-04-17 00:00:00.000','13:00',9),
(654661,2784762,232836, '2023-04-17 00:00:00.000','13:00',9),
(654661,2784763,232837, '2023-04-17 00:00:00.000','13:00',9),--corrected
(654662,2784798,232888, '2023-04-18 00:00:00.000','15:00',9),
(654662,2784799,232889, '2023-04-18 00:00:00.000','15:00',9);
используйте только pivot
,row_number
и concat
select header_id,
[client_id1],
[client_id2],
[client_id3],
[client_id4],
on_date ,
on_time,
room_id
from
(
select header_id,
client_id ,
CONCAT('client_id',ROW_NUMBER() OVER ( PARTITION BY header_id ORDER BY appointment_id,on_date, on_time, room_id)) PT,
on_date ,
on_time,
room_id
from resu
) src
pivot
(
MAX(client_id)
for PT in ([client_id1], [client_id2], [client_id3], [client_id4])
) piv;
Так в чем ваш вопрос? Какова логика получения ожидаемых результатов от выборочных данных? Что вы пробовали? Почему это не сработало? А как насчет сотен (вероятно, тысяч) постов о поворотах, которые уже существуют на сайте, вы не поняли?