【问题标题】:On Transact-SQL: possible to build a statement to create a new column while using the data of another column all from the same table.在 Transact-SQL 上:可以构建一个语句来创建一个新列,同时使用来自同一个表的另一列的数据。
【发布时间】:2019-01-27 23:58:15
【问题描述】:

在 Transact-SQL 上:想要创建一个语句,将一列添加到我当前的活动表中,新添加的列将从同一个表的另一列中获取数据。它将添加每一行的数据并在新列上进行汇总。

具体来说,

我在一家生产红薯薯条的公司工作,我们使用标签来描述每个盒子的内容。

我有一个表格,在打印标签时会更新和填充,标签会出现在每个盒子上;所以标签数量==我们生产的盒子数量。该表有一栏描述了每个箱子的重量;名为 [CaseWeight] 的列。

我想将此 CaseWeight 列对新列进行 Sum([CaseWeight]) 并将其称为总磅数。虽然仍然能够看到表中的其余列。

【问题讨论】:

    标签: c# sql database tsql sql-server-2012


    【解决方案1】:

    您可以使用带有窗口功能的视图:

    create view v_t as
        select t.*, sum(weight) over () as total_pounds
        from t;
    

    您不能将窗口函数作为生成列放入,因此这可能是最好的方法。

    【讨论】:

    • 好吧,我正在考虑采用另一种方法,可能使用连接,例如“自连接”。它允许我自己加入表格。但我对创建“自加入”语句并不是很熟悉,所以我对它的外观有点困惑。
    • @BayronPerdomo 。 . .自联接是不必要的。窗口函数通常更快。
    【解决方案2】:

    要向表中添加列,您可能需要删除表,具体取决于服务器设置。在这种情况下,我所做的是将表的数据备份到另一个表中(SELECT * INTO MyTableBackup FROM MyTable)。然后我删除表并使用新列重新创建它(注意:删除和重新创建表时,不要忘记重新创建索引和键!)。然后我从备份表插入新表。求和时,您将在插入时执行 Group By。因此,如果您想要订单中每个包裹的重量总和,您可以:

        SELECT SUM(CaseWeight) AS TotalPounds FROM MyTableBackup GROUP BY OrderNumber
    

    你可以像这样把它放在选择的中间:

        INSERT INTO MyTable
        SELECT
            bak.OrderNumber
            ,bak.NumberOfCases
            ,bak.CaseWeight
            ,(SELECT SUM(CaseWeight) FROM MyTableBackup b WHERE b.OrderNumber = bak.OrderNumber GROUP BY OrderNumber) AS TotalPounds
        FROM MyTableBackup bak
    

    只需确保在执行 DROP 和 INSERT 之前测试查询的选择部分。

    【讨论】:

    • 另外,在此之前先明确一点 - 在执行任何此类操作之前,请确保您有一个有效的备份!
    猜你喜欢
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 2019-11-20
    相关资源
    最近更新 更多