【问题标题】:How to get the SUM of all values in CSV in SQL Sever? [duplicate]如何在 SQL Server 中获取 CSV 中所有值的总和? [复制]
【发布时间】:2021-03-19 13:58:20
【问题描述】:

我有一个 CSV,我想获取其中所有值的总和,但找不到好的解决方案。

我曾想过像下面这样尝试STRING_SPLIT,但它需要compatibility level 130,而且我的SQL Server 是120。我无法更改兼容级别。

DECLARE @csv VARCHAR(MAX) = '1,2,3,4,5';
SELECT SUM(*) FROM STRING_SPLIT(@csv, ','); --It should return 15

SQL Server 详细信息:

Microsoft SQL Server 2019 (RTM-CU9) (KB5000642) - 15.0.4102.2 (X64)
2021 年 1 月 25 日 20:16:12 版权所有 (C) 2019 Microsoft Corporation Windows Server 2019 Datacenter 10.0 上的开发人员版(64 位) (内部版本 17763:)(管理程序)

【问题讨论】:

  • 但是您可以轻松轻松地搜索在以前版本中工作的字符串拆分函数。
  • @Larnu 我们都知道有时您会因为管理决策、时间限制或其他因素而陷入糟糕的设计。如果我试图“按应有的方式”构建一切,我将永远无法完成任何事情。
  • 我不想开始讨论@Larnu 单词的含义(尤其是在人们对语言的微妙之处有不同看法的跨国平台上)。如果 OP 说他们不能/不会实施 proper (tm) 解决方案,因为它会影响太多组件,那么可以安全地假设它是“can't i>”不是“我不想”。
  • USE master; 你的主数据库应该在 150 级
  • 性能将是相同的,只需确保您使用 DB 名称 db.schema.table 限定所有表、视图和函数名称。之后可以切换回来,没问题。 AFAIK 你可以在交易中做到这一点。

标签: sql-server sql-server-2019


【解决方案1】:

功能:

CREATE FUNCTION [dbo].[STRING_SPLIT]
(
    @string VARCHAR(MAX),
    @separator VARCHAR
)
RETURNS @returnList TABLE ([value] INT) 
AS
BEGIN
    DECLARE @location INT
    WHILE (CHARINDEX(@separator,    @string, 0) > 0)
    BEGIN
            SET @location =   CHARINDEX(@separator,    @string, 0) 
            
            INSERT INTO   @returnList
            SELECT CAST(RTRIM(LTRIM(SUBSTRING(@string,   0, @location))) AS INT)

            SET @string = STUFF(@string,   1, @location,   '') 
    END
    INSERT INTO @returnList
    SELECT CAST(RTRIM(LTRIM(@string)) AS INT)
    RETURN
END

用途:

DECLARE @csv VARCHAR(MAX) = '1,2,3,4,5';
SELECT SUM(value) FROM dbo.STRING_SPLIT(@csv, ',');

【讨论】:

  • WHILE 将是迄今为止最慢的方法。基于集合的方法会更好。
  • 我不是专家。我还从 StackOverflow 中找到了方法。我在我的一个项目中使用了它,并为这个答案做了一些调整。
  • 我建议看看这个answer,它展示了一个很棒的基于集合的解决方案。
  • 确实如此。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-15
  • 2013-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
相关资源
最近更新 更多