如何在同一列中将1个concat列与多个值相加

时间:2014-07-30 23:04:10

标签: sql sql-server dynamic sum

我有一个简单的列,其值如下:

__ID__|_________COLUM 1____
reg 1 | 12.4                |
reg 2 | 12.9 , 14.4 , 12.94 | 
reg 3 | 12.1 , 14.2 , 12.2  |
reg 4 | 12.3 , 12.98        |
reg 5 | 12.5 , 14.0         |
reg 6 | 12.3 , 14   , 12.9  |

我想要的是通过id(垂直)

对值进行求和

我正在考虑使用动态sql替换逗号(,)为(+),但我不知道如何使总和工作.....

我想要这样的结果

__ID__|_________COLUM 1____
reg 1 | 12.4                |
reg 2 | 40.24               |
reg 3 | 38.5                |
reg 4 | 25.28               |
reg 5 | ...........         |
reg 6 | ................... |

PIVOT表不是这样的,因为有> 1000000的regs和while循环。我不知道,也许还有另一种方式。

1 个答案:

答案 0 :(得分:1)

您需要为此

创建分割功能

分割功能定义

CREATE FUNCTION [dbo].[split]
    (
      @delimited NVARCHAR(MAX),
      @delimiter NVARCHAR(100)
    ) 
 RETURNS @t TABLE (id INT IDENTITY(1,1), val NVARCHAR(MAX))
AS
BEGIN
  DECLARE @xml XML
  SET @xml = N'<t>' + REPLACE(@delimited,@delimiter,'</t><t>') + '</t>'

  INSERT INTO @t(val)
  SELECT  r.value('.','varchar(MAX)') as item
  FROM  @xml.nodes('/t') as records(r)
  RETURN
END

测试数据

DECLARE @TABLE TABLE (ID VARCHAR(10), Column1 VARCHAR(1000))

INSERT INTO @TABLE (ID,Column1)  VALUES 
('reg 1'  ,'12.4'               ),
('reg 2'  ,'12.9 , 14.4 , 12.94'),
('reg 3'  ,'12.1 , 14.2 , 12.2' ),
('reg 4'  ,'12.3 , 12.98'       ),
('reg 5'  ,'12.5 , 14.0'        ),
('reg 6'  ,'12.3 , 14   , 12.9' )

查询

SELECT t.ID
      ,SUM(CAST(l.Vals AS DECIMAL(10,2))) Total
FROM @TABLE t
        CROSS APPLY (SELECT val FROM [dbo].[split](t.Column1, ',')) l(Vals)
GROUP BY t.ID

结果

╔═══════╦═══════╗
║  ID   ║ Total ║
╠═══════╬═══════╣
║ reg 1 ║ 12.40 ║
║ reg 2 ║ 40.24 ║
║ reg 3 ║ 38.50 ║
║ reg 4 ║ 25.28 ║
║ reg 5 ║ 26.50 ║
║ reg 6 ║ 39.20 ║
╚═══════╩═══════╝
相关问题