扩展 my last question关于可以根据另一列中的数据将一列中的值转换或转置为不同列的 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
ENTITLMENT 和 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 和用户的多行。
关于c# - 根据其他两列中的值透视一列中的行值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56672576/