我有一个简单的列,其值如下:
__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循环。我不知道,也许还有另一种方式。
答案 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 ║
╚═══════╩═══════╝