Данные TSQL Stuff - PullRequest
       1

Данные TSQL Stuff

0 голосов
/ 31 августа 2018

Мне нужно найти способ 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;

1 Ответ

0 голосов
/ 31 августа 2018

Попробуйте это:

;WITH cte AS (
    SELECT t.customerid,
           t.Number,
           t.DateFrom,
           t.DateTo,
           ROW_NUMBER() over (order by datefrom) - ROW_NUMBER() over (partition by number order by datefrom) grpCol
    FROM   @Test t
), cte2 AS (
    SELECT customerid, 
           cast(MIN(datefrom) as varchar(10)) + ' - ' + cast(MAX(dateto) as varchar(10)) + ': ' + cast(number as varchar(10)) [text],
           MIN(datefrom) datefrom
    FROM cte c
    group by customerid, number, grpCol
)

SELECT customerid, 
       (select [text] + ', ' from cte2 where customerid = c.customerid order by datefrom for xml path('')) [text]
FROM cte2 c
GROUP BY customerid

Выход:

customerid | text
1          | 201710 - 201803: 240, 201803 - 201805: 300, 201805 - 999999: 240, 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...