SQL 服务器查询 return 结果集中缺少范围的行号为空白

SQL Server query to return missing line numbers of range as blank in resultset

我有一个简单的问题,我有一个 table 缺少一些行,需要这些行在我的 SQL 响应中显示为空白。

Table 参考如下(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. 我是身份证号
  2. N 作为行号
  3. 旁白作为评论字符串

我需要使用查询 return 所有行(包括缺失的 Line Numbers) 例如,如果 ID 5 被拉起,我需要 return 编号 1、2 和 3。

这里的问题是没有第 2 行,所以我需要查询用空白注释填充缺失的行

预期结果:

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

注意:结果始终以 1 开头,最多可达 50。

如果 CTE 可以做到这一点,那将是一个很大的优势,因为这将是一个更大的查询的一部分,引用 4 个其他 table 到 return 单个数据集。

这部分查询将用于创建一个基于字符串的串联结果,其中指示符用作每条评论行的换行符(下面的示例使用“|”符号)。

如上所说,如果能得到如下的结果就更好了

预期结果:

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

我希望这是有道理的。

下面应该得到最终结果,尽管它有点啰嗦。 得到了 Concatenate column string

的帮助

声明@tbl table ( 我知道, n 整数, 叙述 varchar(100) )

插入@tbl (i, n, Narration)
select 1, 1, 'PRODUCTION OVERSTATED ON JOBCARD'
联合所有
select2、1、'WORK CENTER NOT LOADED'
联合所有
select3、1、'REVERSE'
联合所有
select 4, 1, 'alkjdflkdjflkajdflkjdflsjkdf'
联合所有
select 5, 1, 'ADD PAPER'
联合所有
select5、3、'LOST03/10/19 ISGAC'
联合所有
select 6, 1, '04/10/19 ISGACL 论文将仅提供 999999'

-- 用序号创建table 声明@tblResults table(i int, n int, Narration varchar(100))

声明@StartNumber 整数,@EndNumber 整数 select @StartNumber = 1,@EndNumber = 50

插入@tblResults (i, n, Narration)
select c.i, c.numbers, isnull(e.Narration, '') 作为叙述
来自
(
select a.numbers, b.i
来自
(select distinct (@StartNumber + number) as Numbers from master..spt_values where number between @StartNumber - 1 and @EndNumber - 1) a
交叉连接(select 不同于@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
在 e.i = c.i 和 e.n = c.Numbers
上左加入@tbl e 其中 d.n 不为空;

SELECT

,东西((
SELECT IIF(idx.n = 1, '', '|') + 旁白
来自@tblResults idx
其中 tbl.i = idx.i
按 n
排序 FOR XML 路径 ('')), 1, 1, ''
) idx
来自@tblResults tbl
按 i

分组

如果仍在寻找没有临时表或变量的答案..

</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