В настоящее время я делаю программу для хранения данных на сервере базы данных sql. а данные - это стоимость, разделенная на максимум 5 столбцов с подробностями о стоимости. Что касается первой строки, она помечена 1, а вторая - 2, до 5 строк с тем же идентификатором. Итак, я делаю таблицу, как на картинке ниже. И теперь я хочу выбрать таблицу от строки к столбцу, как на картинке. я делаю такой запрос. Я получаю результат, как хочу, но проблема в том, что стоимость запроса в 5 и более раз превышает план выполнения, просто выбирая ту же таблицу. Мой вопрос в том, есть ли способ сделать результат, как на картинке, просто выбрав один раз таблицу или есть ли какой-либо другой способ добиться такого же результата с лучшей производительностью, я слышал об использовании поворота для транспонирования строки в столбец, но в В моем случае я не знаю, как это сделать. Спасибо за ответ
это план выполнения https://www.brentozar.com/pastetheplan/?id=SJGJdaCB7
И это тот запрос, который я использовал
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%.
пожалуйста, не вставляйте изображения, если вы можете добавить свой запрос и вывод в виде текста, а фактический план выполнения может быть опубликован в Интернете: brentozar.com/pastetheplan
извините, я не знаю, могу ли я скопировать план выполнения. а как теперь редактировать вопрос?
Пожалуйста, взгляните на этот мой вопрос в качестве примера, вы можете опубликовать вопрос без изображений: stackoverflow.com/questions/41840829, если вы можете это сделать, у вас больше шансов получить ответ
Хорошо, я опубликую вопрос без изображения дальше. но могу ли я отредактировать сообщение? или я могу удалить его и создать новый? @ Таннер
вы можете редактировать, под сообщением над комментариями вы должны увидеть серый текст / кнопку редактировать. Не удаляйте и не добавляйте новый вопрос. Вы можете удалить и отредактировать тот же вопрос, а затем, когда будете счастливы, вы сможете отменить его удаление.
@Tanner, я сейчас редактировал вопрос. но составить таблицу результатов сложно. поэтому я сохраняю результат таблицы на изображении


Возможно, 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 Рад помочь
Снимок действительно трудно читать.