【问题标题】:TSQL Pivot table rows to columnsTSQL Pivot 表行到列
【发布时间】:2022-01-09 11:26:55
【问题描述】:

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

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

requestId groupId entryDate approvalDate apvStatus projMan denialReason
1 1 2020-11-02 2019-07-25 APPROVED rx1942 NULL
1 2 2020-11-02 2019-07-25 APPROVED ma2674 NULL
1 3 2020-11-02 2019-07-25 APPROVED cb9097 NULL
1 4 2020-11-02 2019-07-25 APPROVED bj1763 NULL
1 5 2020-11-02 2019-07-25 APPROVED tr5972 NULL
2 1 2020-11-02 NULL NOT APPROVED NULL 6
2 2 2020-11-02 NULL PENDING ma2674 NULL
2 3 2020-11-02 NULL PENDING cb9097 NULL
2 4 2020-11-02 NULL PENDING bj1763 NULL
2 5 2020-11-02 NULL PENDING tr5972 NULL

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

我唯一能想到的就是从同一个表中为每个 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

【问题讨论】:

  • 请不要张贴图片,使用格式化文本。还包括您当前的查询

标签: sql sql-server tsql


【解决方案1】:

你可以这样做:

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( groupId AS VARCHAR(2)) AS approvalDatePivot,
    'projMan_' + CAST( 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

【讨论】:

  • 只有当所有五个group_id 值都保证始终存在并且从来没有低于1 的值时,使用DENSE_RANK() 才有意义。在这种情况下,您最好只使用group_id。 ..
  • 同意,但只有group_id 如何区分由 2 个主元生成的列名?
  • 在你的子查询中仍然使用串联,只是串联group_id而不是dense_rank?
【解决方案2】:

对于多列的旋转,使用 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 也是一个聚合函数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2013-11-04
    • 1970-01-01
    • 2012-06-20
    • 2018-11-08
    • 2019-05-09
    • 2013-01-20
    相关资源
    最近更新 更多