首页 > 解决方案 > 使用sql server在单行中显示表的对角行元素

问题描述

我有一个由 5 个字段组成的数据库表,一个是 int 数据类型,其余四个是字符串类型。

ref_num field 1         field 2        field 3             field 4
38      Test_user1      NULL            NULL                NULL
38      NULL          Network_L2_P1     NULL                NULL
38      NULL            NULL            user_1              NULL
38      NULL            NULL            NULL               Test_user
39      Test_user1      NULL            NULL                 NULL
39      NULL           Test_user2       NULL                 NULL
39      NULL            NULL           Test_user3            NULL
39      NULL            NULL            NULL               Test_user4

我希望这些对角线排列的字段值出现在单行中。像这样-

ref_num    field 1        field 2         field 3         field 4
38      Test_user1     Network_L2_P1      user_1      Test_user5
39      Test_user1      Test_user2      Test_user3    Test_user4

如何为此创建 sql 查询?

我们可以有 n 没有。字段,可以是任何名称,也可以是任何 ref_num

我尝试在 4 个字符串字段上使用 max 函数 max() 并尝试使用 group by 子句运行查询以获得预期结果。实际的挑战是这四个字段中的这些名称可以是任何名称。所以我们不能一直使用 max() 并且 max() 在我们的例子中返回字符串值的 int 值。在我们的案例中也不支持 rank() 函数。

标签: sql-server

解决方案


尝试这个:

    DECLARE @SQL NVARCHAR(MAX)
    SELECT @SQL = (
        SELECT '
        ' +
        STUFF((
            SELECT ', ' +  (
            'SUBSTRING(
            (
                SELECT '',''+ST1.[' + c.name + ']  AS [text()]
                FROM dbo.testTemp ST1
                WHERE ST1.[Tid] = ST2.[Tid] 
                ORDER BY ST1.[Tid]
                FOR XML PATH ('''')
            ), 2, 1000) '
            ) +  ' AS [' + c.name  +']'     

           FROM sys.columns c
            WHERE c.[object_id] = o.[object_id] and c.name not in ( 'ref_num')   --- here column name of your id column
            FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, 'SELECT DISTINCT ST2.[Tid], ') + '
        FROM [' + SCHEMA_NAME(o.[schema_id]) + '].[' + o.name + '] as ST2 ' -- select *
        FROM sys.objects o
        WHERE o.[type] = 'U'
            AND o.is_ms_shipped = 0
            AND [name] = 'testTemp'   ---- your table name
        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)')
    EXEC sys.sp_executesql @SQL

n这是列数的通用解决方案。

如果对您有用,请将其标记为已接受....


推荐阅读