繁体   English   中英

TSQL Pivot 表行到列

[英]TSQL Pivot table rows to columns

我在一个表格中有一些数据,如下所示。 我正在尝试运行一个查询,该查询将在每个 requestId 的单行上获取我的数据。 我不需要日期或拒绝原因,只需要每个 groupId 的 eprojman 和 apvStatus

requestId - projMan1 - apvStatus1 - projMan2 - apvStatus2 - projMan3 - apvStatus3 等.. 对于所有 5 个 groupId

请求ID 组 ID 入境日期 批准日期 apv状态 项目人 否认理由
1 1 2020-11-02 2019-07-25 得到正式认可的 RX1942 NULL
1 2 2020-11-02 2019-07-25 得到正式认可的 ma2674 NULL
1 3 2020-11-02 2019-07-25 得到正式认可的 CB9097 NULL
1 4 2020-11-02 2019-07-25 得到正式认可的 bj1763 NULL
1 5 2020-11-02 2019-07-25 得到正式认可的 tr5972 NULL
2 1 2020-11-02 NULL 不批准 NULL 6
2 2 2020-11-02 NULL 待办的 ma2674 NULL
2 3 2020-11-02 NULL 待办的 CB9097 NULL
2 4 2020-11-02 NULL 待办的 bj1763 NULL
2 5 2020-11-02 NULL 待办的 tr5972 NULL

我一直在尝试使用 PIVOT 表,但我发现的所有示例都涉及汇总数据或其他内容。 我只是非常想取 5 行并将每个 requestID 变成 1

我唯一能想到的是 select 从同一张表中为每个 groupID 5 次并将其合并,但这比见鬼要慢。 必须是更好的方法

谢谢。

当前查询:

select group1.requestId
    , group1.apvStatus as apvStatus1
    , group1.projMan as projMan1
    , group2.apvStatus as apvStatus2
    , group2.projMan as projMan2
    , group3.apvStatus as apvStatus3
    , group3.projMan as projMan3
    ,group4.apvStatus as apvStatus4
    , group4.projMan as projMan4
    ,group5.apvStatus as apvStatus5
    , group5.projMan as projMan5
    ,group1.denialReason 
    INTO #TEMPBAOrganized
    from (
    select requestId, apvStatus, projMan, denialReason from #TEMPBULKAPPROVAL where groupId = 1) group1
    INNER JOIN 
    (select requestId, apvStatus, projMan, denialReason from #TEMPBULKAPPROVAL where groupId = 2) group2
    on group1.requestId = group2.requestId
    INNER JOIN
    (select requestId, apvStatus, projMan from #TEMPBULKAPPROVAL where groupId = 3) group3
    on group1.requestId = group3.requestId
    INNER JOIN
    (select requestId, apvStatus, projMan from #TEMPBULKAPPROVAL where groupId = 4) group4
    on group1.requestId = group4.requestId
    INNER JOIN
    (select requestId, apvStatus, projMan from #TEMPBULKAPPROVAL where groupId = 5) group5
    on group1.requestId = group5.requestId

你可以这样做:

SELECT
    requestId,
    approvalDate_1 = MAX(approvalDate_1),
    approvalDate_2 = MAX(approvalDate_2),
    approvalDate_3 = MAX(approvalDate_3),
    approvalDate_4 = MAX(approvalDate_4),
    approvalDate_5 = MAX(approvalDate_5), 
    projMan_1 = MAX(projMan_1),
    projMan_2 = MAX(projMan_2),
    projMan_3 = MAX(projMan_3),
    projMan_4 = MAX(projMan_4),
    projMan_5 = MAX(projMan_5)
FROM
(
SELECT
    requestId,
    groupId, 
    approvalDate,
    projMan,
    'approvalDate_' + CAST( (DENSE_RANK() OVER(PARTITION BY requestId ORDER BY groupId)) AS VARCHAR(2)) AS approvalDatePivot,
    'projMan_' + CAST( (DENSE_RANK() OVER(PARTITION BY requestId ORDER BY groupId)) AS VARCHAR(2)) AS projManPivot
FROM
  @tbl
) T
PIVOT (
  MAX(approvalDate) FOR approvalDatePivot IN ([approvalDate_1],[approvalDate_2],[approvalDate_3],[approvalDate_4],[approvalDate_5])
) pvt_1
PIVOT (
  MAX(projMan) FOR projManPivot IN ([projMan_1],[projMan_2],[projMan_3],[projMan_4],[projMan_5])
) pvt_2

GROUP BY requestId

对于多列的旋转,将CASE表达式与聚合一起使用会更容易。

select  t.requestId,
        projMan1    = max(case when t.groupId = 1 then t.projMan end),
        apvStatus1  = max(case when t.groupId = 1 then t.apvStatus end),
        projMan2    = max(case when t.groupId = 2 then t.projMan end),
        apvStatus2  = max(case when t.groupId = 2 then t.apvStatus end),
        projMan3    = max(case when t.groupId = 3 then t.projMan end),
        apvStatus3  = max(case when t.groupId = 3 then t.apvStatus end),
        projMan4    = max(case when t.groupId = 4 then t.projMan end),
        apvStatus4  = max(case when t.groupId = 4 then t.apvStatus end),
        projMan5    = max(case when t.groupId = 5 then t.projMan end),
        apvStatus5  = max(case when t.groupId = 5 then t.apvStatus end)
from    #TEMPBULKAPPROVAL t
group by t.requestId

注意: max也是一个聚合 function

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM