SQL SERVER превращает данные строки в столбец

В настоящее время я делаю программу для хранения данных на сервере базы данных sql. а данные - это стоимость, разделенная на максимум 5 столбцов с подробностями о стоимости. Что касается первой строки, она помечена 1, а вторая - 2, до 5 строк с тем же идентификатором. Итак, я делаю таблицу, как на картинке ниже. И теперь я хочу выбрать таблицу от строки к столбцу, как на картинке. я делаю такой запрос. Я получаю результат, как хочу, но проблема в том, что стоимость запроса в 5 и более раз превышает план выполнения, просто выбирая ту же таблицу. Мой вопрос в том, есть ли способ сделать результат, как на картинке, просто выбрав один раз таблицу или есть ли какой-либо другой способ добиться такого же результата с лучшей производительностью, я слышал об использовании поворота для транспонирования строки в столбец, но в В моем случае я не знаю, как это сделать. Спасибо за ответ

это план выполнения https://www.brentozar.com/pastetheplan/?id=SJGJdaCB7

SQL SERVER превращает данные строки в столбец И это тот запрос, который я использовал

select * FROM TblKecelakaanBiaya; 

with tbl AS (
    select *, ROW_NUMBER() OVER(PARTITION by id_kasus ORDER BY id_kasus) rn FROM TblKecelakaanBiaya
)

SELECT A.id_kasus, A.ket_biaya1, A.jlh_biaya1, C.ket_biaya2, C.jlh_biaya2,
        D.ket_biaya3, D.jlh_biaya3, E.ket_biaya4, E.jlh_biaya4, F.ket_biaya5, F.jlh_biaya5
FROM (SELECT id_kasus, ket_biaya ket_biaya1, jlh_biaya jlh_biaya1 FROM tbl WHERE rn = 1) A
LEFT JOIN (SELECT id_kasus, ket_biaya ket_biaya2, jlh_biaya jlh_biaya2 FROM tbl WHERE rn = 2) C ON A.id_kasus = C.id_kasus
LEFT JOIN (SELECT id_kasus, ket_biaya ket_biaya3, jlh_biaya jlh_biaya3 FROM tbl WHERE rn = 3) D ON A.id_kasus = D.id_kasus
LEFT JOIN (SELECT id_kasus, ket_biaya ket_biaya4, jlh_biaya jlh_biaya4 FROM tbl WHERE rn = 4) E ON A.id_kasus = E.id_kasus
LEFT JOIN (SELECT id_kasus, ket_biaya ket_biaya5, jlh_biaya jlh_biaya5 FROM tbl WHERE rn = 5) F ON A.id_kasus = F.id_kasus

План выполнения для запроса 1 составляет всего 1%, а для другого - 99%.

Снимок действительно трудно читать.

qxg 13.08.2018 10:54

пожалуйста, не вставляйте изображения, если вы можете добавить свой запрос и вывод в виде текста, а фактический план выполнения может быть опубликован в Интернете: brentozar.com/pastetheplan

Tanner 13.08.2018 10:54

извините, я не знаю, могу ли я скопировать план выполнения. а как теперь редактировать вопрос?

arden 13.08.2018 10:57
brentozar.com/pastetheplan/?id=SJGJdaCB7 @ Таннер
arden 13.08.2018 11:01

Пожалуйста, взгляните на этот мой вопрос в качестве примера, вы можете опубликовать вопрос без изображений: stackoverflow.com/questions/41840829, если вы можете это сделать, у вас больше шансов получить ответ

Tanner 13.08.2018 11:03

Хорошо, я опубликую вопрос без изображения дальше. но могу ли я отредактировать сообщение? или я могу удалить его и создать новый? @ Таннер

arden 13.08.2018 11:06

вы можете редактировать, под сообщением над комментариями вы должны увидеть серый текст / кнопку редактировать. Не удаляйте и не добавляйте новый вопрос. Вы можете удалить и отредактировать тот же вопрос, а затем, когда будете счастливы, вы сможете отменить его удаление.

Tanner 13.08.2018 11:09

@Tanner, я сейчас редактировал вопрос. но составить таблицу результатов сложно. поэтому я сохраняю результат таблицы на изображении

arden 13.08.2018 11:29
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
8
129
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Возможно, Pivot несовместим с Cross Apply.

Пример

Select * 
  From (
        Select id_kasus,item,value
         From (Select * ,RN = Row_Number() over (Partition By id_kasus Order By id_kasus) From TblKecekakaanBiaya ) A
         Cross Apply (values (concat('jih_biaya',RN),convert(varchar(150),jih_biaya))
                            ,(concat('ket_biaya',RN),ket_biaya)
                     ) b(item,value)
       ) src
 Pivot (max(value) for item in ([ket_biaya1],[jih_biaya1],[ket_biaya2],[jih_biaya2],[ket_biaya3],[jih_biaya3],[ket_biaya4],[jih_biaya4],[ket_biaya5],[jih_biaya5])  ) pvt

Возврат

@arden Рад помочь

John Cappelletti 13.08.2018 11:49

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