Я пытаюсь сгенерировать элемент, сводку диапазона дат из списка элементов, даты (ей) для sql-2008.tsql список дат к датам диапазонов
DECLARE @RoomDays AS TABLE (
[RoomID] [int] NOT NULL,
[DateOf] [date] NOT NULL,
[Segment] [char](1) NOT NULL
)
INSERT INTO @RoomDays
VALUES
('1','2013-07-03','1'),
('1','2013-07-04','1'),
('1','2013-07-05','6'),
('1','2013-07-15','6'),
('1','2013-07-16','6'),
('2','2013-07-08','1'),
('2','2013-07-09','1'),
('2','2013-07-10','6'),
('2','2013-07-11','6'),
('2','2013-07-12','1'),
('2','2013-07-13','1'),
('3','2013-07-19','6')
Результаты, которые я пытаюсь получить:
RoomID DateFrom DateThru Segments NumDays
1 2013-07-03 2013-07-05 1,1,6 3
1 2013-07-15 2013-07-16 6,6 2
2 2013-07-08 2013-07-13 1,1,6,6,1,1 6
3 2013-07-19 2013-07-19 6 1
Я просто не могу получить мою голову вокруг, как это сделать ...
..maybe это для столбца Сегменты:
(
SELECT CAST(ltrim(rtrim(SegmentID)) + ', ' AS VARCHAR(MAX))
from @RoomDays where roomid = rd.roomid
FOR XML PATH ('')
)+' ' as Segments,
--
Любая помощь или руководство будут оценены.
Попытайтесь найти информацию о «Gaps and Islands». – GilM
Как отличить 1-ю и 2-ю строки от результатов, так как id одинаковый? – Tomasito
Я сделал blogpost в мае об этом. Статья находится на шведском языке: http://blogs.solidq.com/SQL-Server-pa-svenska/Post.aspx?ID=24&title=Hur+konkatenering+med+FOR+XML+PATH+fungerar. Я запустил его через google translate, и получилось ok-ish (слово предупреждения, перекрывающиеся слова на английском и шведском языках, возможно, были переведены внутри кода). Проверьте это здесь: http://translate.google.com/translate?sl=sv&tl=ru&js=n&prev=_t&hl=ru&ie=UTF-8&u=http%3A%2F%2Fblogs.solidq.com%2FSQL-Server-pa -svenska% 2FPost.aspx% 3FID% 3D24% 26title% 3DHur% 2Bkonkatenering% 2Bmed% 2BFOR% 2BXML% 2BPATH% 2Bfungerar. –