Запрос SQL Server для возврата пропущенных номеров строк диапазона как пустых в наборе результатов - PullRequest
0 голосов
/ 05 октября 2019

У меня есть простая проблема, когда у меня отсутствует таблица с некоторыми строками, и мне нужно, чтобы эти строки отображались как пустые в моем ответе SQL.

Ссылка на таблицу ниже (BomNarration):

I   N   Narration
-----------------------------------------
1   1   PRODUCTION OVERSTATED ON JOBCARD
2   1   WORK CENTER NOT LOADED
3   1   REVERSE
4   1   alkjdflkdjflkajdflkjdflsjkdf
5   1   ADD PAPER
5   3   LOST03/10/19 ISGAC
6   1   04/10/19 ISGACL PAPER WILL ONLY BE AVAILBLE 999999

Здесь отображается столбец:

  1. I в качестве идентификационного номера
  2. N в качестве номера строки
  3. Повествование в виде строки комментария

Мне нужно использовать запрос, чтобы вернуть все строки (в том числе пропущенные Line Numbers). Например, если ID 5 получен, мне нужно вернуть номера 1, 2 и 3.

Проблема здесь естьнет строки 2, поэтому мне нужен запрос, чтобы заполнить пропущенную строку пустым комментарием

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

I   N   Narration
-----------------------------
5   1   ADD PAPER
5   2   
5   3   LOST03/10/19 ISGAC

ПРИМЕЧАНИЕ: , результаты всегда будут начинатьсяс 1 и может быть до 50.

Если это возможно с CTE, это было бы большим преимуществом, так как это было бы частью гораздо более крупного запроса, ссылающегося на 4 другие таблицы, чтобы вернуть один набор данных.

Эта часть запроса будет использоваться для создания конкатенации на основе строк. Результат ed с индикаторами, которые будут использоваться в качестве разрывов строк (в приведенном ниже примере используется символ «|») для каждой строки комментария.

Как упоминалось выше, если бы я мог получить результат, подобный приведенному ниже, он был бы еще лучше.

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

I   ConcatNarration
----------------------------------------------------------------
5   ADD PAPER|{Blank Line Number here as ''}|LOST03/10/19 ISGAC

Надеюсь, это имеет смысл.

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Ниже приведен конечный результат, хотя он немного затянут. Получил справку от Объединенная строка столбца

объявление таблицы @tbl (i int, n int, Narration varchar (100))

вставка в @tbl (i, n,Повествование)выберите 1, 1, «ИЗГОТОВЛЕНИЕ ПРОДУКЦИИ НА JOBCARD»объединить всехвыберите 2, 1, «РАБОЧИЙ ЦЕНТР НЕ ЗАГРУЖЕН»объединить всехвыберите 3, 1, «ОБРАТНЫЙ»объединить всехвыберите 4, 1, 'alkjdflkdjflkajdflkjdflsjkdf'объединить всехвыберите 5, 1, «ДОБАВИТЬ БУМАГУ»объединить всехвыберите 5, 3, 'LOST03 / 10/19 ISGAC'объединить всехвыберите 6, 1, '04/10/19 БУМАГА ISGACL БУДЕТ ТОЛЬКО В НАЛИЧИИ 999999'

- создать таблицу с последовательными числами, объявить таблицу @tblResults (i int, n int, Narration varchar (100))

объявить @StartNumber integer, @EndNumber integer select @StartNumber = 1,@EndNumber = 50

вставить в @tblResults (i, n, Narration)выберите ci, c.numbers, isnull (e.Narration, '') в качестве Повествованияиз(выберите номера, бииз(выберите разные (@StartNumber + number) в качестве чисел из master..spt_values, где число между @StartNumber - 1 и @EndNumber - 1) aперекрестное соединение (выберите отличное i от @tbl) b) слевое соединение (выберите i, max (n) n из группы @tbl по i) d на di = ci и dn> = c.numbersоставьте соединение @tbl e на ei = ci и en = c.Numbersгде dn не является нулем;

ВЫБРАТЬя, ВЕЩЕСТВО ((ВЫБЕРИ IIF (idx.n = 1, '', '|') + ПовествованиеFROM @tblResults idxГДЕ tbl.i = idx.iЗАКАЗАТЬFOR XML PATH ('')), 1, 1, '') idxОТ @tblResults tblGROUP BY я

0 голосов
/ 18 октября 2019

Если вы все еще ищете ответ без временных таблиц или переменных ..

</p>

<p>declare @tbl table (
    i int,
    n int,
    Narration varchar(100)
)</p>

<p>insert into @tbl (i, n, Narration)
select 1,   1,   'PRODUCTION OVERSTATED ON JOBCARD'
union all
select 2,   1,   'WORK CENTER NOT LOADED'
union all
select 3,   1,   'REVERSE'
union all
select 4,   1,   'alkjdflkdjflkajdflkjdflsjkdf'
union all
select 5,   1,   'ADD PAPER'
union all
select 5,   3,   'LOST03/10/19 ISGAC'
union all
select 6,   1,   '04/10/19 ISGACL PAPER WILL ONLY BE AVAILBLE 999999'</p>

<p>-- create table with sequential numbers
declare @tblResults table(i int, n int, Narration varchar(100))</p>

<p>declare @StartNumber integer, @EndNumber integer
select @StartNumber = 1, @EndNumber = 50;</p>

<p>with SeqNumbers(seqnum)
as
(
    select 1 as seqnum
    union all
    select seqNum + 1 as seqnum
    from SeqNumbers
    where seqnum < @EndNumber
)</p>

<p>SELECT
    i
    ,STUFF((
        SELECT IIF(idx.numbers = 1, '', ' | ') + Narration
        FROM </p>

    (select c.i, c.numbers, isnull(e.Narration, '') as Narration
        from
        (
            select a.numbers, b.i
            from
            (select distinct seqnum as Numbers from SeqNumbers) a
            cross join (select distinct i from @tbl) b
        ) c 
        left join (select i, max(n) n from @tbl group by i) d on d.i = c.i and d.n >= c.numbers
        left join @tbl e on e.i = c.i and e.n = c.Numbers
        where d.n is not null
    ) idx
WHERE tbl.i = idx.i
ORDER BY numbers
FOR XML PATH ('')), 1, 1, '') idx
FROM (select c.i, c.numbers, isnull(e.Narration, '') as Narration
from
(
    select a.numbers, b.i
    from
    (select distinct seqnum as Numbers from SeqNumbers) a
    cross join (select distinct i from @tbl) b
) c 
left join (select i, max(n) n from @tbl group by i) d on d.i = c.i and d.n >= c.numbers
left join @tbl e on e.i = c.i and e.n = c.Numbers
where d.n is not null) tbl
GROUP BY i 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...