You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在循环中横向拼接多个Delta表并创建临时表?

问题描述

我通过@DynamicSQL生成了若干结构如下的独立表:

表1(Date_2, Date_1)

StatusDate_2, Date_1
Alive15
Dead-4
Unknown25

表2(Date_3, Date_2)

StatusDate_3, Date_2
Alive56
Dead44
Unknown-244

表3(Date_4, Date_3)

StatusDate_4, Date_3
Alive18
Dead2
Unknown5

依此类推,我需要将这些表横向拼接成如下格式的汇总表,无需手动复制到Excel:

StatusDate_2, Date_1Date_3, Date_2Date_4, Date_3
Alive155618
Dead-4442
Unknown25-2445

请问如何通过创建临时表,配合循环实现自动横向拼接?


解决方案(以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;

注意事项

  1. 确保所有动态表的Status值集合一致,否则LEFT JOIN会出现NULL值,可根据需求改用INNER JOIN或处理NULL。
  2. 所有日期差列的数据类型要统一,避免拼接时出现类型错误。
  3. 如果表名无规律,需先将目标表名存入临时表,再用游标遍历。

内容的提问来源于stack exchange,提问作者Isaac A

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 01:20:32