sql-server - 使用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() 函数。
解决方案
尝试这个:
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
这是列数的通用解决方案。
如果对您有用,请将其标记为已接受....
推荐阅读
- python-3.x - 使用 pyinstaller 从 .py 创建的 exe 存在 tensorflow 路径问题
- c# - asp.net core 2.0 控制台应用程序文件notfoundexception system.runtime 4.2.0.0
- python - 分而治之找到一个列表的最大和子列表
- python - 如何从表格中计算 pyspark 中的每周平均值?
- react-native - 在发布版本中反应原生地图崩溃
- c# - 无法转换 ICollection
到 IEnumerable - c# - 使用 js 发布到 api (asp.net core mvc)
- python - 如何让函数仅返回与特定字符串匹配的列表?
- protractor - 将名称参数添加到量角器配置文件
- python-3.x - 如何通过 subprocess.call 调用 python