Мне нужно найти способ Group By
некоторым данным определенным образом.
id Number FROM TO
1 240 201710 201712
1 240 201712 201801
1 240 201801 201803
1 300 201803 201805
1 240 201805 999999
Мне нужно, чтобы они были сгруппированы таким образом:
id TEXT
1 201710 - 201803: 240, 201803 - 20180: 300, 201805 - 999999: 240
Моя проблема в правильной группировке. Он должен сгруппировать строки 1-3 и установить FROM
в 201710
и TO
в 201803
. Но я не могу сгруппировать по номеру, потому что он может измениться позже снова.
Есть идеи?
Единственная идея, которую я имею, это проверять FROM с помощью FROM следующей строки и устанавливать его на предыдущий FROM, если число совпадает. Тогда я могу сгруппироваться по id, number
и FROM
и взять MAX
из TO
. Но я действительно не хочу использовать Курсор.
Вот тестовый скрипт:
DECLARE @Test AS table
(
customerid int,
Number int,
DateFrom int,
DateTo int
);
INSERT INTO @Test
VALUES (1, 240, 201710, 201712),
(1, 240, 201712, 201801),
(1, 240, 201801, 201803),
(1, 300, 201803, 201805),
(1, 240, 201805, 999999);
SELECT t.customerid,
t.Number,
t.DateFrom,
t.DateTo
FROM @Test t;
SELECT customerid,
STUFF(
(SELECT DISTINCT
', ' + CONVERT(varchar(100), (t2.DateFrom)) + ' - ' + CONVERT(varchar(100), (t2.DateTo)) + ' : '
+ CONVERT(varchar(100), (t2.Number))
FROM @Test t2
FOR XML PATH('')),
1,
2,
'') AS Text
FROM @Test t
WHERE t.customerid = t2.customerid
GROUP BY t.customerid;