【问题标题】:Sum columns with the same prefix in SQL Server在 SQL Server 中对具有相同前缀的列求和
【发布时间】:2022-12-13 03:55:04
【问题描述】:

我认为这是一个非常基本的问题,但我找不到如何在 SQL Server 中执行此操作的答案。 我有一张桌子:

ID Pref_01 Pref_02 ... Pref_40
01 5 2 ... 7
02 6 7 ... 5

我希望我的输出包含两列:ID、Sum_pref 以及以“pref”命名星星的列的总和。我知道如何在 R 或 SAS 中的 SQL 中执行此操作,但现在我必须在 SQL Server 中执行此操作,但我被卡住了。如果有任何帮助,我将不胜感激。

【问题讨论】:

  • 一种方法是取消数据透视,然后 SUM 它。另一种是简单地使用基本加法:Pref01 + Pref02 + ... + Pref_40。我怀疑您实际拥有的是这里的非规范化设计。
  • 基本添加不是解决方案。在原始数据中,我有更多的列和不同的前缀,所以这对很多工作来说都是如此。我在 SAS 中寻找类似 sum(of Prefix:) 的东西
  • 没有这样的功能。如果您想使用SUM,您需要先对数据进行逆透视,然后再对列进行SUM
  • 这很糟糕 :(。您能否提供一个示例,说明如何使用 unpivot 执行此操作?
  • 什么不好?还有很多,例如:Unpivot with column name

标签: sql sql-server


【解决方案1】:

请尝试以下解决方案。

它使用 SQL Server 的 XML 和 XQuery 功能来实现您的需要。

数据库

-- DDL and sample data population, start
DECLARE @tbl TABLE (id INT IDENTITY PRIMARY KEY, Pref_01 INT, Pref_02 INT, Pref_40 INT);
INSERT @tbl (Pref_01, Pref_02, Pref_40) VALUES
(5, 2, 7),
(6, 7, 5);
-- DDL and sample data population, end

SELECT t.*
   , [sum-columns-across-the-row]
FROM @tbl AS t
CROSS APPLY (SELECT t.* FOR XML PATH(''), TYPE, ROOT('root')) AS t1(x)
CROSS APPLY (SELECT x.value('sum(/root/*[contains(local-name(), "Pref_")]/text()) cast as xs:integer?', 'INT')) AS t2([sum-columns-across-the-row]);

输出

id Pref_01 Pref_02 Pref_40 sum-columns-across-the-row
1 5 2 7 14
2 6 7 5 18

【讨论】:

    猜你喜欢
    • 2021-08-29
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-12
    • 2018-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多