提取一行并将其转换为列 headers

Extracting a row and converting it into column headers

我有一个由单独界面暂存的 table,该文件的 headers 是以下行的一部分:

ID Col1 Col2 Col3 Col4 Coln
Amt1 Amt2 Amt3 Amt4 Date
10 8.00 6.00 8.00 8.50 01/02/2021
12 7.00 7.00 3.50 8.00 03/01/2021

列是由界面动态创建的,因此它们将是 Col1 到 Coln,然后暂存到此 table。因此,主要目标是创建一个 rdl 报告,该报告将显示 table 中的所有记录,每次界面运行时都会更改。

我无法修改界面,所以有没有一种方法可以将 headers 的整行从 table 中提取到另一个 table 中以生成这些值列 headers 和值如下:

ID Amt1 Amt2 Amt3 Amt4 Date
10 8.00 6.00 8.00 8.50 01/02/2021
12 7.00 7.00 3.50 8.00 03/01/2021

或者是否有一种方法可以在 rdl 文件中使用动态创建的标题正确显示此数据?

写一个查询 dynamically unpivots table 中的数据。

然后使用 matrix report 动态调整结果以进行展示。

或者,如果返回的列的确切数量未知,但已知在某个最大可能列集中,您可以生成包含所有可能列的报告,然后以编程方式设置列 headers(或者如果所有可能的列 headers 也事先已知,则静态创建这些列),并以编程方式隐藏报告中没有数据的列。

我必须说,使用报告工具更容易做到这一点,但如果需要,可以使用动态 SQL 来完成。

最复杂的是你甚至不知道你有多少个基列,或者它们的名字是什么,所以我们需要做两个动态查询:一次获取基列的列名称值,然后再次获取实际值。

动态 SQL 可能会让人非常困惑,请尽量清楚哪些部分是静态的,哪些部分是动态的。确保始终对动态列名使用 QUOTENAME(someValue),对动态文本使用 QUOTENAME(someValue , ''''),这确保它们被正确转义。

I've assumed the row with ID IS NULL is the one with the column names

DECLARE @sql nvarchar(max), @cols nvarchar(max);

SET @sql = N'
SELECT @cols = CONCAT_WS('','''
+ (
    SELECT '
,' + CASE WHEN c.name = 'ID' THEN '''ID''' ELSE
      'QUOTENAME(' + QUOTENAME(c.name) + ', '''') + ''='' + QUOTENAME(' + QUOTENAME(c.name, '''') + ')'
      END
    FROM sys.columns c
    WHERE c.object_id = OBJECT_ID('YourTable')
    FOR XML PATH(''), TYPE
).value('text()[1]','nvarchar(max)') + '
)
FROM YourTable t
WHERE ID IS NULL
';

PRINT @sql;  -- for testing

EXEC sp_executesql
  @sql,
  N'@cols nvarchar(max) OUTPUT',
  @cols = @cols OUTPUT;

SET @sql = N'
SELECT ' + @cols + '
FROM YourTable
WHERE ID IS NOT NULL
';

PRINT @sql; -- for testing

EXEC sp_executesql @sql;

db<>fiddle

由于 header 行的 ID 为 NULL,因此您可以使用 FILTER:

从 table 数据中过滤出该记录
=IIF(ISNOTHING(Fields!ID.Value), 0 , 1)

然后对于您的 header 行,您只需为每列标识具有 NULL 值的记录。

=MAX(IIF(ISNOTHING(Fields!ID.Value), NOTHING, Fields!Col1.Value))

谢谢大家的回答,我最终合并了其中的大部分,但也将列数硬编码为 250,不太可能达到该数字,但它已作为临时解决方案。