PIVOT SQL SERVER 问题

问题描述 投票:0回答:1

我需要一些帮助来在我的数据中实现 SQL PIVOT。

这里是查询:

select a.id_mcm AS ID,b.nama_mcm AS Name,c.nama_ctr AS Place,a.tgl_mutasi AS Move_On
from mcmmutasi as a
left join mcmmcm as b on b.id_mcm=a.id_mcm
left join mcmcenter as c on c.kode_ctr=a.kode_ctr
where a.id_mcm='ATP211004131604'
order by a.tgl_mutasi asc ,b.nama_mcm asc

这是它的输出:

身份证 姓名 地点 继续移动
ATP211004131604 苏马蒂尼 2021-10-04 00:00:00.000 安塔帕尼
ATP211004131604 苏马蒂尼 2021-12-03 14:33:19.450 西库特拉

我想做的是让 2 行变成 1。 所以这是我想要实现的愿望表:

身份证 姓名 老地方 新地方 继续移动
ATP211004131604 苏马蒂尼 安塔帕尼 西库特拉 2021-10-04 00:00:00.000

因此用户可以轻松阅读以了解人员历史/日志的历史。

我在阅读和了解它的同时尝试使用 PIVOT SQLServer

但是我遇到了一些错误并且完全不知道如何使用它。

那么任何人都可以帮助我并告诉我如何实现这一目标。

这是我的 PIVOT 查询代码:

WITH pivot_data AS
(
select a.id_mcm as id ,b.nama_mcm as name , c.nama_ctr as Place,a.tgl_mutasi as Move_On
from mcmmutasi as a
left join mcmmcm as b on b.id_mcm=a.id_mcm
left join mcmcenter as c on c.kode_ctr=a.kode_ctr
where a.id_mcm='ATP211004131604'
)
SELECT  name,place,move_on
FROM pivot_data
PIVOT (max(id) FOR id IN (name,place,move_on)) AS p;
sql mysql sql-server pivot dynamic-pivot
1个回答
0
投票

Pivot 不太适合这种情况,因为您似乎同时需要 MIN() 和 MAX(),因此请使用

group by
,例如:

SELECT
      a.id_mcm AS ID
    , b.nama_mcm AS Name
    , min(c.nama_ctr) as old_place
    , max(c.nama_ctr) as new_place
    , max(a.tgl_mutasi) AS Move_On
FROM mcmmutasi AS a
LEFT JOIN mcmmcm AS b ON b.id_mcm = a.id_mcm
LEFT JOIN mcmcenter AS c ON c.kode_ctr = a.kode_ctr
WHERE a.id_mcm = 'ATP211004131604'
GROUP BY a.tgl_mutasi ASC
    , b.nama_mcm ASC
ORDER BY a.tgl_mutasi ASC
    , b.nama_mcm ASC

但是如果任何选择的行数超过 2 行,则此分组结果可能不是您所希望的。可能需要提供更复杂的样本数据(以及更复杂数据的预期结果)。

© www.soinside.com 2019 - 2024. All rights reserved.