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 対 783 に関して間違いを犯したと思います. 8/20.)

于 2013-08-22T16:28:16.770 に答える