簡體   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