Заполните пропуски года, чтобы показать отдельные списки пропусков - SQL Server - PullRequest
0 голосов
/ 28 июня 2018

У меня есть столбец с последовательностью. Мне нужно найти пробелы в последовательности и запустить материал для создания отдельных списков, где происходит пробел. Я создал cte с min и max для использования с вещами .. Хотя я не могу понять, как определить пробелы в последовательности. Пожалуйста помогите. Вот те же данные:

CREATE TABLE Table1
(
    sku varchar(50), 
    year float, 
    make varchar(50),  
    model varchar(50),
    model2 varchar(50)
);

INSERT INTO Table1 (sku, year, make, model, model2)
VALUES ('AVS1234', '2000',  'Xbox', 'pilot', 'ex'),
       ('AVS1234', '2001',  'Xbox', 'pilot', 'ex'),
       ('AVS1234', '2014',  'Xbox', 'pilot', 'ex');

WITH firstpass AS
(
    SELECT
        sku,
        MIN(year) AS min,
        MAX(year) AS max,
        make, model, model2
    FROM
        Table1
    GROUP BY
        sku, make, model, model2
)
SELECT 
    sku,
    CAST([min] AS NVARCHAR(10)) + '-' + 
    CAST([max] AS NVARCHAR(10)) + ' ' + make + ' ' + model +
    STUFF((SELECT DISTINCT ', ' + COALESCE([model2], '') + ''
           FROM firstpass 
           WHERE sku = a.sku
           FOR XML PATH (''), TYPE).value('(./text())[1]', 'VARCHAR(MAX)'), 1, 1, '') AS NamesList2,
    ROW_NUMBER() OVER (PARTITION BY sku ORDER BY sku asc) AS RowNum
FROM 
    firstpass AS a
GROUP BY 
    sku, [min], [max], make, model;

DROP TABLE table1

Ожидаемый результат:

sku          Nameslist                  Row
-------------------------------------------
AVS1234      2000 - 2001 xbox Pilot ex  1
AVS1234      2014 xbox Pilot ex         2

1 Ответ

0 голосов
/ 28 июня 2018

Это классический разрыв и острова с небольшим изгибом.

* ** 1003 тысяча два * Пример
Select SKU
      ,Nameslist = concat(
                   case when min(Year)<> max(Year) then concat(min(Year),' - ') end
                   ,max(year)
                   ,' '+max(make)
                   ,' '+max(model)
                   ,' '+max(model2)
                  )
 From (
         Select *
               ,Grp = Year - Row_Number() over (Partition by SKU order by Year)
          From  Table1
      ) A
 Group By SKU,Grp

Returns

SKU        Nameslist
AVS1234    2000 - 2001 Xbox pilot ex
AVS1234    2014 Xbox pilot ex
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...