簡體   English   中英

根據其他兩列中的值透視一列中的行值

[英]Pivoting row values in one column based on values in two other columns

擴展關於 SQL 查詢或 C# 代碼的最后一個問題,這些代碼可以根據另一列的數據將一列中的值轉置或轉置為不同的列:

在進一步檢查數據后,我需要一個腳本或查詢,可以根據其他兩列中的值將一列中的行值轉換為不同的列。

例如,這是我當前的數據表:

ID      USERID     ATTRIBUTE       ATTRIBUTE VALUE 
00001   15         Entitlement       80
00001   15         Entitlement       81
00001   15         Permission        90
00001   15         Permission        91
00001   15         Permission        92
00001   16         Entitlement       82
00001   16         Permission        93

我需要輸出表看起來像:

ID      USERID        ENTITLEMENT     PERMISSION 
00001   15               80           90
00001   15               81           91
00001   15                            92
00001   16               82           93 

其中 ENTITLEMENT 和 PERMISSION 列中的值按 USERID 分組。

我知道當它們之間的行數不匹配時,任何一個新列中都會有 Null 值,只要每個新列包含所有行值並與正確的 USERID 對應就可以了。

使用 T-SQL 透視數據,即

select ID, USERID, ENTITLEMENT, PERMISSION from dbo.Test_Table
pivot (Max(ATTRIBUTE VALUE) for Attribute IN ([ENTITLEMENT], [PERMISSION])) as PivotTable
order by ID asc

...由於 MAX 聚合,不會返回所有值。

上一個答案中的 C# 代碼工作正常,但同樣只考慮 ATTRIBUTE VALUE 列。

再次感謝您對這項任務的任何幫助。 C# 不是我的強項。

您可以使用以下 DENSE_RANK

SELECT 
      CASE WHEN A.ID IS NULL THEN B.ID ELSE A.ID END AS ID,
      CASE WHEN A.USERID IS NULL THEN B.USERID ELSE A.USERID END AS USERID,
      A.[ATTRIBUTEVALUE] ENTITLEMENT,
      B.[ATTRIBUTEVALUE] PERMISSION 
FROM
    (
      SELECT *,
      DENSE_RANK() over (partition by  ATTRIBUTE order by  ATTRIBUTEVALUE)  RN1 
      FROM  <<yourtable>>
      WHERE ATTRIBUTE = 'Entitlement'
     )A
FULL OUTER JOIN
     (
      SELECT *,
      DENSE_RANK() over (partition by  ATTRIBUTE order by  ATTRIBUTEVALUE)  RN2 
      FROM <<yourtable>>
      WHERE ATTRIBUTE = 'Permission'
      )B  ON A.RN1 = B.RN2
ORDER BY 2,3

輸出如下所示

 ID         USERID      ENTITLEMENT PERMISSION
 ---------- ----------- ----------- -----------
 00001      15          80          90
 00001      15          81          91
 00001      16          NULL        93
 00001      16          82          92

不幸的是,PIVOT 不支持您希望數據的外觀。 因為您想為相同的 id 和用戶顯示多行。

您可以嘗試使用以下腳本來獲得所需的輸出-

SELECT 
CASE WHEN A.ID IS NULL THEN B.ID ELSE A.ID END AS ID,
CASE WHEN A.USERID IS NULL THEN B.USERID ELSE A.USERID END AS USERID,
A.[ATTRIBUTE VALUE] ENTITLEMENT,
B.[ATTRIBUTE VALUE] PERMISSION 
FROM
(
    SELECT *,ROW_NUMBER() OVER(PARTITION BY USERID ORDER BY USERID) RN1 FROM your_table
    WHERE ATTRIBUTE = 'Entitlement'
)A
FULL OUTER JOIN
(
    SELECT *,ROW_NUMBER() OVER(PARTITION BY USERID ORDER BY USERID) RN2 FROM your_table
    WHERE ATTRIBUTE = 'Permission'
)B
ON A.RN1 = B.RN2 AND A.USERID = B.USERID
ORDER BY 2

輸出是-

ID      USERID  ENTITLEMENT PERMISSION 
00001   15      80          90
00001   15      81          91
00001   15      NULL            92
00001   16      82          93

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM