如何在循环中横向拼接多个Delta表并创建临时表?
问题描述
我通过@DynamicSQL生成了若干结构如下的独立表:
表1(Date_2, Date_1)
| Status | Date_2, Date_1 |
|---|---|
| Alive | 15 |
| Dead | -4 |
| Unknown | 25 |
表2(Date_3, Date_2)
| Status | Date_3, Date_2 |
|---|---|
| Alive | 56 |
| Dead | 44 |
| Unknown | -244 |
表3(Date_4, Date_3)
| Status | Date_4, Date_3 |
|---|---|
| Alive | 18 |
| Dead | 2 |
| Unknown | 5 |
依此类推,我需要将这些表横向拼接成如下格式的汇总表,无需手动复制到Excel:
| Status | Date_2, Date_1 | Date_3, Date_2 | Date_4, Date_3 |
|---|---|---|---|
| Alive | 15 | 56 | 18 |
| Dead | -4 | 44 | 2 |
| Unknown | 25 | -244 | 5 |
请问如何通过创建临时表,配合循环实现自动横向拼接?
解决方案(以SQL Server环境为例)
步骤1:创建初始临时表存储基础Status列
先创建临时表,把所有Status值存入作为基础:
-- 创建基础临时表 SELECT DISTINCT Status INTO #FinalSummary FROM [第一个生成的表名]; -- 替换成你动态生成的第一个表的名称
步骤2:循环拼接所有生成的表
假设动态生成的表名有规律(比如以Temp_开头),用游标配合动态SQL逐个拼接:
DECLARE @TableName NVARCHAR(128); DECLARE @ColName NVARCHAR(128); DECLARE @SQL NVARCHAR(MAX); -- 声明游标,遍历所有需要拼接的表 DECLARE TableCursor CURSOR FOR SELECT name, -- 获取每个表的日期差列名(排除Status列) (SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = name AND COLUMN_NAME <> 'Status') AS ColName FROM sys.tables WHERE name LIKE 'Temp_%'; -- 替换成你的动态表命名规则 OPEN TableCursor; FETCH NEXT FROM TableCursor INTO @TableName, @ColName; WHILE @@FETCH_STATUS = 0 BEGIN -- 动态生成添加列+更新数据的SQL SET @SQL = N' ALTER TABLE #FinalSummary ADD [' + @ColName + '] INT; -- 数据类型根据实际情况调整 UPDATE fs SET fs.[' + @ColName + '] = t.[' + @ColName + '] FROM #FinalSummary fs LEFT JOIN [' + @TableName + '] t ON fs.Status = t.Status; '; EXEC sp_executesql @SQL; FETCH NEXT FROM TableCursor INTO @TableName, @ColName; END CLOSE TableCursor; DEALLOCATE TableCursor;
如果能一次性获取所有表信息,也可以直接生成全连接语句:
DECLARE @JoinSQL NVARCHAR(MAX); DECLARE @ColList NVARCHAR(MAX); -- 生成列清单和连接条件 SELECT @ColList = COALESCE(@ColList + ', ', '') + 't' + CAST(ROW_NUMBER() OVER(ORDER BY name) AS NVARCHAR) + '.[' + ColName + ']', @JoinSQL = COALESCE(@JoinSQL + ' LEFT JOIN ', '') + '[' + name + '] t' + CAST(ROW_NUMBER() OVER(ORDER BY name) AS NVARCHAR) + ' ON t1.Status = t' + CAST(ROW_NUMBER() OVER(ORDER BY name) AS NVARCHAR) + '.Status' FROM ( SELECT name, (SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = name AND COLUMN_NAME <> 'Status') AS ColName FROM sys.tables WHERE name LIKE 'Temp_%' ) AS TableCols; -- 生成最终汇总SQL SET @SQL = N' SELECT t1.Status, ' + @ColList + ' INTO #FinalSummary FROM [' + (SELECT TOP 1 name FROM sys.tables WHERE name LIKE 'Temp_%') + '] t1' + @JoinSQL + '; '; EXEC sp_executesql @SQL;
步骤3:查看拼接结果
执行以下语句即可得到横向拼接后的汇总表:
SELECT * FROM #FinalSummary;
注意事项
- 确保所有动态表的
Status值集合一致,否则LEFT JOIN会出现NULL值,可根据需求改用INNER JOIN或处理NULL。 - 所有日期差列的数据类型要统一,避免拼接时出现类型错误。
- 如果表名无规律,需先将目标表名存入临时表,再用游标遍历。
内容的提问来源于stack exchange,提问作者Isaac A
相关产品推荐
相关产品推荐

