提取一行并将其转换为列 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;
由于 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,不太可能达到该数字,但它已作为临时解决方案。
我有一个由单独界面暂存的 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;
由于 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,不太可能达到该数字,但它已作为临时解决方案。