![](/img/trans.png)
[英]Making TWO row values into one column, and another row value another column, with the possibility of adding more row values into columns
[英]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.