【问题标题】:SQL SERVER make a row data to columnSQL SERVER 将行数据写入列
【发布时间】:2018-08-13 08:51:45
【问题描述】:

我目前正在制作一个程序来将数据存储在数据库 sql server 中。 数据是一个成本,最多分为 5 列成本细节。 至于第一行它用 1 标记,第二行用 2 标记,最多 5 行具有相同的 id。 所以我正在制作如下图所示的表格。现在我想像图片中那样从行到列选择表格。 我正在做这样的查询。我得到了我想要的结果,但问题是查询成本是执行计划的 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%。

【问题讨论】:

标签: sql sql-server database pivot


【解决方案1】:

可能是交叉应用导致的枢轴不一致。

示例

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 乐于助人
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-17
  • 2021-03-02
  • 2022-06-11
  • 1970-01-01
  • 1970-01-01
  • 2019-04-09
  • 2016-02-22
相关资源
最近更新 更多