SQL SERVER将行数据写入列

时间:2018-08-13 08:51:46

标签: sql sql-server database pivot

我目前正在制作一个程序,用于在数据库sql服务器中存储数据。 数据是一项费用,分为最多5列费用明细。 至于第一行,它标记为1,第二个标记为2,最多5个具有相同ID的行。 所以我要像下面的图片一样制作桌子。现在,我想从行到列中选择表,如图所示。 我正在这样查询。我得到了想要的结果,但是问题是,只需选择同一张表,查询成本就可能是执行计划的5 /倍以上。 我的问题是,是否有一种方法可以通过选择表一次来使结果与图片中的一样,或者是否有其他方法可以使结果具有更好的性能,我听说使用透视将行换成列,但是我的情况下,我不知道该怎么做。感谢您的答复

这是执行计划https://www.brentozar.com/pastetheplan/?id=SJGJdaCB7

this Image is The Table in database and The Result i want 这是我使用的查询

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%。

1 个答案:

答案 0 :(得分:2)

可能是带有交叉应用的数据透视不一致。

示例

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

返回

enter image description here

enter image description here