【问题标题】:SQL Row Data to Column Data in Join连接中的 SQL 行数据到列数据
【发布时间】:2021-11-07 07:51:48
【问题描述】:

试图用我的小脑袋思考如何编写这个查询,我不知所措:

当前:

我希望它看起来如何:

如果有人可以向我指出可以帮助我解决此问题的功能,将不胜感激。我已经尝试过使用:

max(case when ....)pivot()

我在其他文章中找到的,但无法让它们与我的 JOIN 一起使用:

SELECT GROUP_ID, ROLE_ID, USER_ID, First_Name, Last_name, Phone
FROM GroupRoles
FULL JOIN Account
ON Account.Account_ID = GroupRoles.User_ID

任何帮助将不胜感激,至少能让我指出正确的方向......

【问题讨论】:

  • “但无法让他们使用我的 JOIN” - max(case ...) 有什么问题?

标签: sql sql-server join ssms


【解决方案1】:

应该这样做。如果您需要灵活的角色数量,那将更加复杂。您需要在字符串中创建 sql 并使用 exec sp_executesql 执行它

select * from
(
    select GROUP_ID, 'ROLE_' + convert(varchar, ROLE_ID) + '_' + Keys as Keys, Vals from
    (
        SELECT GROUP_ID, ROLE_ID, USER_ID, convert(varchar, First_Name) as First_Name, convert(varchar, Last_name) as Last_name, convert(varchar, Phone) as Phone
        FROM GroupRoles
        FULL JOIN Account
        ON Account.Account_ID = GroupRoles.User_ID
    ) t
    UNPIVOT  
    (
        Vals FOR Keys IN   
        (First_Name, Last_name, Phone)  
    ) AS unpvt
) AS SourceTable  
PIVOT  
(  
  MAX(Vals)  
  FOR Keys IN (
        ROLE_1_First_Name,
        ROLE_1_Last_name,
        ROLE_1_Phone,
        ROLE_2_First_Name,
        ROLE_2_Last_name,
        ROLE_2_Phone,
        ROLE_3_First_Name,
        ROLE_3_Last_name,
        ROLE_3_Phone,
        ROLE_4_First_Name,
        ROLE_4_Last_name,
        ROLE_4_Phone,
        ROLE_5_First_Name,
        ROLE_5_Last_name,
        ROLE_5_Phone
    )  
) AS PivotTable

【讨论】:

  • 如此接近!我可以在没有电话字段的情况下让它工作。当我有电话字段时,我得到以下信息:“列'电话'的类型与 UNPIVOT 列表中指定的其他列的类型冲突。”我在想我们必须将输出电话字段设置为?这很奇怪,因为它是一个 varchar(20),甚至不是一个特殊的 int 字段或任何东西。有什么想法吗?
  • 你会认为它只会四舍五入到最长的varchar!我将转换添加到查询中以使它们相同。我认为限制查询中的 varchar 长度没有任何好处
  • 你是圣人。完美运行!我没想到你会为我提供整个解决方案!不过,我确实从这个查询中学到了很多东西,再次感谢!
  • 没问题。通过解决其中一些问题,我学到了很多东西
  • 好的,我有 1 个小问题。我想从“帐户”表中添加一个新列。但是当我这样做时,我会得到很多空结果。我尝试将它添加到“Vals FOR Keys IN”并添加键“_COLUMNNAME”,但我得到所有内容的空值。任何想法如何从帐户表中添加新列?它在 GroupRoles 表中不存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
  • 2015-10-18
  • 1970-01-01
相关资源
最近更新 更多