Превращает строки в столбцы

Я использую 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

Так в чем ваш вопрос? Какова логика получения ожидаемых результатов от выборочных данных? Что вы пробовали? Почему это не сработало? А как насчет сотен (вероятно, тысяч) постов о поворотах, которые уже существуют на сайте, вы не поняли?

Thom A 21.04.2024 13:00

Я пробовал это stackoverflow.com/questions/15745042/… и stackoverflow.com/questions/15931607/…, но мой случай совершенно другой.

PanosPlat 21.04.2024 13:01

Если вы храните on_date и on_time отдельно — почему бы вам не использовать DATE для on_date и TIME для on_time? Зачем использовать строковый тип для вашего on_time ??? Эти правильные типы данных доступны начиная с SQL Server 2008.....

marc_s 21.04.2024 13:04

Итак, еще раз, в чем ваш вопрос, логика, попытка, причина неудачи и непонимания?

Thom A 21.04.2024 13:08

Элегантный способ сделать это вместо создания 4 блоков IF.

PanosPlat 21.04.2024 13:15

и курсор...

PanosPlat 21.04.2024 13:23

К вашему сведению, срок службы SQL Server 2012 истек около 2 лет назад; вам действительно необходимо реализовать свой путь обновления, чтобы перейти на полностью поддерживаемую версию SQL Server.

Thom A 21.04.2024 13:50

@marc_s К сожалению, база данных существовала раньше. Это пример кода.

PanosPlat 21.04.2024 13:58
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

если ваши данные верны

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

dbfiddle

однако я думаю, что ваши входные данные на сайте содержат ошибки и корректируя данные

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;

dbfiddle

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