Как перенести строки в столбцы в SQL SERVER без создания промежуточной таблицы

#sql #sql-server #tsql #pivot-table #transpose

Вопрос:

Пожалуйста, помогите мне перенести нижеприведенную таблицу, не создавая промежуточную таблицу. Попытался ПОВЕРНУТЬ, но потерпел неудачу. Любые предложения также будут полезны. Спасибо!

Существующая таблица:

время Ценность
4/8/2020 5:18 1
4/8/2020 5:22 0
4/8/2020 7:22 1
4/8/2020 7:31 0
4/9/2020 1:44 1
4/9/2020 1:50 0

Желаемые результаты:

1 0
4/8/2020 5:18 4/8/2020 5:22
4/8/2020 7:22 4/8/2020 7:31
4/9/2020 1:44 4/9/2020 1:50

Комментарии:

1. Как получилось, что PIVOT «провалился»? Я бы посоветовал вам провести еще несколько исследований и попробовать еще раз. Это определенно то, что вы хотите сделать.

2. Какие-либо предложения или ссылки для ссылки? пожалуйста, поделитесь

3. Да, я уже включил одну ссылку в свой первоначальный комментарий в качестве отправной точки.

4. СВОДНАЯ система не работает, потому что агрегатная функция MAX() или MIN() в столбцах времени возвращает только 1 строку из ожидаемого результата. Есть какие-нибудь предложения?

5. Я бы предложил попробовать ответ Гордона Линоффа ниже.

Ответ №1:

Вы можете перечислить их и агрегировать:

 select max(case when value = 1 then time end) as value_1,
       max(case when value = 0 then time end) as value_0
from (select t.*,
             row_number() over (partition by value order by time) as seqnum
      from t
     ) t
group by seqnum;
 

Комментарии:

1. Спасибо! Это тоже работает. Но не могу отметить оба ответа как решенные.

2. @MamunurRashid . . . Это было за 16 минут до другого ответа.

Ответ №2:

Попробуйте это решение в сочетании ROW_NUMBER с функцией окна и PIVOT :

 SELECT [0], [1]
FROM 
(
  SELECT Value, TIME, ROW_NUMBER() OVER (PARTITION BY Value ORDER BY TIME) Rb
  FROM MyTable
) AS SourceTable
PIVOT
(
  MAX(TIME)
  FOR Value IN ([0], [1])
) AS PivotTable