SQL - 如何在相关的 table 中每行获得 1 个空列?
SQL - How do I get 1 empty column per row in a related table?
我正在尝试编写一个 SQL 查询,根据 Crystal 的相关 table (t1) 中的行数添加一定数量的空列报告。这些列应具有数据集名称的 header。
所以它应该看起来像这样:
然而,每次添加新行时我都需要更改脚本(例如,开一家商店 - 不经常,但确实会发生)。
我考虑过使用 pivot 函数,但我认为必须定义行数 - 另外,不会发生计算/聚合。
有人知道如何解决这个问题吗?
正如 Larnu 已经提到的,动态 SQL 是一种可行的方法。我建议结合使用 XML PATH 和动态 SQL。下面举个例子:
DECLARE @colList VARCHAR(MAX) = (SELECT STUFF((SELECT ',NULL as t1_row' + cast(col1 AS varchar(3))
FROM MyTable
FOR XML PATH('')) ,1,1,'') AS Txt
)
DECLARE @stmt VARCHAR(MAX) = 'SELECT Col1, Col2, Col3, ' + @colList + ' FROM MyTable'
EXEC (@stmt)
我能够使用动态 SQL 获得结果。
脚本看起来像这样:
DECLARE @STRSQL NVARCHAR(MAX) = 'WITH a AS (SELECT ';
DECLARE @Kst nvarchar(6);
DECLARE @Markt NVARCHAR(30);
DECLARE @SCHEMA_NAME VARCHAR(50) = 'XTRADE';
DECLARE C1 CURSOR FOR
SELECT NUMMER, BEZEICHNUNG
from XTRADE.KUNDE
where NUMMER > 99 and NUMMER not in (194, 196, 198)
and (DATUM_SCHLIESSUNG > GETDATE() or DATUM_SCHLIESSUNG is null)
order by BEZEICHNUNG
OPEN C1
PRINT @Kst + ' ' + @Markt
FETCH NEXT
FROM C1 into @Kst, @Markt
while @@FETCH_STATUS = 0
BEGIN
SET @STRSQL = @STRSQL + 'null as [' + @Markt + '], '
FETCH NEXT
FROM C1 into @Kst, @Markt
END
CLOSE C1
DEALLOCATE C1;
SET @STRSQL = left(@STRSQL, len(@Strsql) - 1) + ')'
DECLARE @Statement nvarchar(max) = ', b as (select 1 as Col1, 1 as Col2, 5 as Col3 union all select 2,2,12 union all select 3, 3, 42)';
DECLARE @Exec nvarchar(max) = @STRSQL + @Statement + 'select * from b cross join a';
print @Exec;
exec sp_executesql @Exec
我正在尝试编写一个 SQL 查询,根据 Crystal 的相关 table (t1) 中的行数添加一定数量的空列报告。这些列应具有数据集名称的 header。
所以它应该看起来像这样:
然而,每次添加新行时我都需要更改脚本(例如,开一家商店 - 不经常,但确实会发生)。
我考虑过使用 pivot 函数,但我认为必须定义行数 - 另外,不会发生计算/聚合。
有人知道如何解决这个问题吗?
正如 Larnu 已经提到的,动态 SQL 是一种可行的方法。我建议结合使用 XML PATH 和动态 SQL。下面举个例子:
DECLARE @colList VARCHAR(MAX) = (SELECT STUFF((SELECT ',NULL as t1_row' + cast(col1 AS varchar(3))
FROM MyTable
FOR XML PATH('')) ,1,1,'') AS Txt
)
DECLARE @stmt VARCHAR(MAX) = 'SELECT Col1, Col2, Col3, ' + @colList + ' FROM MyTable'
EXEC (@stmt)
我能够使用动态 SQL 获得结果。 脚本看起来像这样:
DECLARE @STRSQL NVARCHAR(MAX) = 'WITH a AS (SELECT ';
DECLARE @Kst nvarchar(6);
DECLARE @Markt NVARCHAR(30);
DECLARE @SCHEMA_NAME VARCHAR(50) = 'XTRADE';
DECLARE C1 CURSOR FOR
SELECT NUMMER, BEZEICHNUNG
from XTRADE.KUNDE
where NUMMER > 99 and NUMMER not in (194, 196, 198)
and (DATUM_SCHLIESSUNG > GETDATE() or DATUM_SCHLIESSUNG is null)
order by BEZEICHNUNG
OPEN C1
PRINT @Kst + ' ' + @Markt
FETCH NEXT
FROM C1 into @Kst, @Markt
while @@FETCH_STATUS = 0
BEGIN
SET @STRSQL = @STRSQL + 'null as [' + @Markt + '], '
FETCH NEXT
FROM C1 into @Kst, @Markt
END
CLOSE C1
DEALLOCATE C1;
SET @STRSQL = left(@STRSQL, len(@Strsql) - 1) + ')'
DECLARE @Statement nvarchar(max) = ', b as (select 1 as Col1, 1 as Col2, 5 as Col3 union all select 2,2,12 union all select 3, 3, 42)';
DECLARE @Exec nvarchar(max) = @STRSQL + @Statement + 'select * from b cross join a';
print @Exec;
exec sp_executesql @Exec