2013-08-22 101 views
1

我有一个结果以这种格式设置现在总和基于逗号分隔栏

CREATE TABLE myTable 
(
    CountColumn INT, 
    DateColumn varchar(max) 
) 

INSERT INTO myTable (CountColumn,DateColumn) 
VALUES(212, '2013-07-15-12-25-11'), (1231,' 2013-07-20-12-25-11 , 2013-08-20-10-25-11') 
, (3143, ' 2013-08-20-10-25-11'), 
(783, '2013-08-20-12-25-11 , 2013-08-21-12-25-11'); 

我有这样设置(即按日期所有countColumn的总和)的结果

COUNT DATE 
212  2013-07-15-12-25-11 
2014  2013-07-20-12-25-11 
4374  2013-08-20-10-25-11 
783  2013-08-21-12-25-11 
+0

你是如何“总结”日期的?即使没有理解你在那里做什么 - 如果你需要两个日期字段创建两列(如果该字段不是强制性的,则允许NULL值)。这将使维护更容易。 – alfasin

+0

@alfasin其实,上表是我的查询结果集的一部分。为了解释它,我将举一个例子,2013年12月20日至12月11日和2013年8月20日至25日期间处理了1231条记录。 – Zerotoinfinity

+0

当你像'',2013-07-20-12-25-11,2013-08-20-10-25-11''插入值 - 这意味着你保存多个值在同一列是一个坏练习和维护噩梦。总是向前看,你将来想要做的任何分析都是困难的,更不用说“按顺序排列”等等。 – alfasin

回答

2

首先,创建一个内嵌表值分割功能(此功能 - you can pick safer or faster ones from here if you need to - 假设你的字符串绝不会包含用于XML entitization一个问题人物,如><等):

CREATE FUNCTION dbo.SplitSafeStrings 
(
    @List  NVARCHAR(MAX), 
    @Delimiter NVARCHAR(255) 
) 
RETURNS TABLE 
WITH SCHEMABINDING 
AS 
    RETURN 
    (SELECT Item = LTRIM(RTRIM(y.i.value('(./text())[1]', 'nvarchar(4000)'))) 
    FROM (SELECT x = CONVERT(XML, '<i>' 
      + REPLACE(@List, @Delimiter, '</i><i>') + '</i>').query('.') 
    ) AS a CROSS APPLY x.nodes('i') AS y(i)); 
GO 

现在你的查询可以是下列之一(取决于您是否想按日期和时间或只是日期):

SELECT s.Item, SUM(CountColumn) 
FROM dbo.myTable AS t 
CROSS APPLY dbo.SplitSafeStrings(t.DateColumn, ',') AS s 
GROUP BY s.Item; 

SELECT LEFT(s.Item, 10), SUM(CountColumn) 
FROM dbo.myTable AS t 
CROSS APPLY dbo.SplitSafeStrings(t.DateColumn, ',') AS s 
GROUP BY LEFT(s.Item, 10); 

其产生这些结果,分别为:

2013-07-15-12-25-11 212 
2013-07-20-12-25-11 1231 
2013-08-20-10-25-11 4374 
2013-08-20-12-25-11 783 
2013-08-21-12-25-11 783 

2013-07-15 212 
2013-07-20 1231 
2013-08-20 5157 
2013-08-21 783 

(这些都不符合问题中的预期结果。如果你真的想要这些结果,你将不得不解释你如何从样本数据中获得它们。我怀疑你在7/20和8/20的783方面犯了错误。)

+0

+1为你的努力。结果集。 – Zerotoinfinity