c# - 根据其他两列中的值透视一列中的行值

标签 c# sql-server t-sql ssis etl

扩展 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/

相关文章:

c# - 如何在 IE 已从登录保护的 Intranet 打开的 Office 文档中启用编辑?

c# - 派生类型的 Entity Framework 导航属性

sql-server - SQL Server 2012 将 EXCEPT 与 ORDER BY 结合使用

sql-server - SQL CLR - 即使用户具有访问权限,TSQL UDF 上仍出现权限错误

sql - 查询需要长时间的调整建议

c# - 每种类型的最新记录?

c# - EF4 代码仅映射继承

c# - 如何将对象转换为不同程序集中的匿名类型?

sql - 如何在没有行时使 SSIS 包失败

sql-server - 检查空 varbinary(max) 列的效率?