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
4

1 回答 1

2

首先,创建一个内联表值拆分函数(此函数 -如果需要,您可以从这里选择更安全或更快的函数- 假设您的字符串永远不会包含对 XML 实体化有问题的字符,例如>,<等):

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 vs 的 783 上犯了一个错误. 8/20。)

于 2013-08-22T16:28:16.770 回答