Sql 如何在每个序列之后实现空行

Sql 如何在每个序列之后实现空行,sql,sql-server,Sql,Sql Server,我有一张桌子 declare @t table (val int) insert INto @t (val) values (420), (420), (520), (520), (520), (620) select val, ROW_NUMBER() OVER (PARTITION BY val order by val) RN from @t 返回输出: val RN ------ 420 1 420 2 520 1 520 2 520 3 620 1 期望输出: va

我有一张桌子

declare @t table (val int)

insert INto @t (val) values (420), (420), (520), (520), (520), (620)

select 
    val, ROW_NUMBER() OVER (PARTITION BY val order by val) RN 
from @t
返回输出:

val RN
------
420 1
420 2
520 1
520 2
520 3
620 1
期望输出:

val RN
420 1
420 2
NULL NULL
520 1
520 2
520 3
NULL NULL
620 1

如何实现这一点?

这种类型的操作实际上应该在应用程序中完成。您可以在SQL Server中执行此操作,但这实际上更像是一个有趣的技巧,然后是一个推荐的答案

其思想是加入所需的行,然后使用
orderby
按顺序获得结果:

select val, rn
from ((select val, ROW_NUMBER() OVER (PARTITION BY val order by val) as rn,
              1 as ordering, val as val2
       from @t t
      ) union all
      (select NULL, NULL, 2, val
       from @t t
       group by val
      )
     ) t
order by val2, ordering, rn;

我要强调的是,这证明了
select
语句的威力。真正的答案是在应用程序层执行此操作。

这种类型的操作实际上应该在应用程序中执行。您可以在SQL Server中执行此操作,但这实际上更像是一个有趣的技巧,然后是一个推荐的答案

其思想是加入所需的行,然后使用
orderby
按顺序获得结果:

select val, rn
from ((select val, ROW_NUMBER() OVER (PARTITION BY val order by val) as rn,
              1 as ordering, val as val2
       from @t t
      ) union all
      (select NULL, NULL, 2, val
       from @t t
       group by val
      )
     ) t
order by val2, ordering, rn;
我要强调的是,这证明了
select
语句的威力。真正的答案是在应用层执行此操作。

此操作有效:

declare @t table (val int)
declare @n table( val int)

insert INTO @n(val) values( NULL )
insert INto @t (val)values (420),(420),(520),(520),(520),(620)

SELECT T2.val, T2.RN AS RN
FROM (
select T.val AS GRP, T.val,ROW_NUMBER()OVER(PARTITION BY T.val order by T.val)RN from @t AS T
union
select DISTINCT T.VAL AS GRP, NULL AS val, NULL AS RN FROM @t AS T
) AS T2
ORDER BY T2.GRP, ISNULL(T2.RN, 99)
要更改摘要行,请选择主选项:

SELECT T2.val, T2.RN AS RN
FROM (
select T.val AS GRP, T.val,ROW_NUMBER()OVER(PARTITION BY T.val order by     T.val) RN from @t AS T
union 
select T.VAL AS GRP, SUM(T.VAL) AS val, NULL AS RN FROM @t AS T GROUP BY T.Val
) AS T2
ORDER BY T2.GRP, ISNULL(T2.RN, 99)
这项工作:

declare @t table (val int)
declare @n table( val int)

insert INTO @n(val) values( NULL )
insert INto @t (val)values (420),(420),(520),(520),(520),(620)

SELECT T2.val, T2.RN AS RN
FROM (
select T.val AS GRP, T.val,ROW_NUMBER()OVER(PARTITION BY T.val order by T.val)RN from @t AS T
union
select DISTINCT T.VAL AS GRP, NULL AS val, NULL AS RN FROM @t AS T
) AS T2
ORDER BY T2.GRP, ISNULL(T2.RN, 99)
要更改摘要行,请选择主选项:

SELECT T2.val, T2.RN AS RN
FROM (
select T.val AS GRP, T.val,ROW_NUMBER()OVER(PARTITION BY T.val order by     T.val) RN from @t AS T
union 
select T.VAL AS GRP, SUM(T.VAL) AS val, NULL AS RN FROM @t AS T GROUP BY T.Val
) AS T2
ORDER BY T2.GRP, ISNULL(T2.RN, 99)

我们都讨厌游标,但对于这种愚蠢的东西,希望有一个小数据集,你可以在sql中而不是在应用层中强行使用它。但感觉很傻。但你能做到

值得一提的是,此解决方案避免了末尾的“额外”空行。因此,它在技术上完全符合您的期望输出。其他人到目前为止还不太清楚

DECLARE @t TABLE (val INT)
INSERT INTO @t (val) VALUES (420),(420),(520),(520),(520),(620)
--SELECT val,ROW_NUMBER()OVER(PARTITION BY val order by val)RN from @t


DECLARE @t2 table (id INT identity(1,1), val INT, rn INT)

DECLARE @val INT
DECLARE @rn INT
DECLARE @val_prev INT


DECLARE CUR CURSOR FOR 
SELECT val
      ,ROW_NUMBER()OVER(PARTITION BY val ORDER BY val)RN 
  FROM @t 
  ORDER BY val ASC

OPEN CUR

FETCH NEXT FROM cur 
INTO @val, @rn

SET @val_prev = @val

WHILE @@FETCH_STATUS = 0
BEGIN

  IF @val_prev <> @val BEGIN
     INSERT @t2 (val,rn) VALUES (NULL, NULL)
     SET @val_prev = @val
  END

  INSERT @t2 (val,rn) VALUES (@val, @rn)
  FETCH NEXT FROM cur 
  INTO @val, @rn
END 
CLOSE cur;
DEALLOCATE cur;

SELECT * FROM @t2 ORDER BY id
DECLARE@t表(val INT)
插入@t(val)值(420)、(420)、(520)、(520)、(520)、(620)
--从@t中选择(按val分区,按val排序)RN上的val,ROW_NUMBER()
声明@t2表(id INT identity(1,1),val INT,rn INT)
声明@val INT
声明@rn INT
声明@val_prev INT
为声明CUR游标
选择val
,行号()在(按val分区按val排序)RN上
来自@t
val ASC订购
开路电流
从cur取下一个
进入@val,@rn
设置为@val_prev=@val
而@@FETCH\u STATUS=0
开始
如果@val_prev@val开始
插入@t2(val,rn)值(NULL,NULL)
设置为@val_prev=@val
结束
插入@t2(val,rn)值(@val,rn)
从cur取下一个
进入@val,@rn
结束
封闭电流;
解除分配cur;
按id从@t2订单中选择*

我们都讨厌游标,但对于一些如此愚蠢的东西,希望有一个小数据集,你可以在sql中而不是在应用层中强制使用它。但感觉很傻。但你能做到

值得一提的是,此解决方案避免了末尾的“额外”空行。因此,它在技术上完全符合您的期望输出。其他人到目前为止还不太清楚

DECLARE @t TABLE (val INT)
INSERT INTO @t (val) VALUES (420),(420),(520),(520),(520),(620)
--SELECT val,ROW_NUMBER()OVER(PARTITION BY val order by val)RN from @t


DECLARE @t2 table (id INT identity(1,1), val INT, rn INT)

DECLARE @val INT
DECLARE @rn INT
DECLARE @val_prev INT


DECLARE CUR CURSOR FOR 
SELECT val
      ,ROW_NUMBER()OVER(PARTITION BY val ORDER BY val)RN 
  FROM @t 
  ORDER BY val ASC

OPEN CUR

FETCH NEXT FROM cur 
INTO @val, @rn

SET @val_prev = @val

WHILE @@FETCH_STATUS = 0
BEGIN

  IF @val_prev <> @val BEGIN
     INSERT @t2 (val,rn) VALUES (NULL, NULL)
     SET @val_prev = @val
  END

  INSERT @t2 (val,rn) VALUES (@val, @rn)
  FETCH NEXT FROM cur 
  INTO @val, @rn
END 
CLOSE cur;
DEALLOCATE cur;

SELECT * FROM @t2 ORDER BY id
DECLARE@t表(val INT)
插入@t(val)值(420)、(420)、(520)、(520)、(520)、(620)
--从@t中选择(按val分区,按val排序)RN上的val,ROW_NUMBER()
声明@t2表(id INT identity(1,1),val INT,rn INT)
声明@val INT
声明@rn INT
声明@val_prev INT
为声明CUR游标
选择val
,行号()在(按val分区按val排序)RN上
来自@t
val ASC订购
开路电流
从cur取下一个
进入@val,@rn
设置为@val_prev=@val
而@@FETCH\u STATUS=0
开始
如果@val_prev@val开始
插入@t2(val,rn)值(NULL,NULL)
设置为@val_prev=@val
结束
插入@t2(val,rn)值(@val,rn)
从cur取下一个
进入@val,@rn
结束
封闭电流;
解除分配cur;
按id从@t2订单中选择*


为什么要这样做?@NickBailey我需要显示为汇总,用于我知道要与汇总一起使用的不同序列的摘要,但它将给出总和值显示在哪个应用程序中的摘要。这种显示逻辑属于应用程序端的应用程序层,只是呈现我在应用程序端显示的值而已绑定。摘要就像地区信息一样,我刚刚给出了样本数据@NickBaileywell,然后更改了应用程序代码为什么要这样做?@NickBailey我需要显示为不同应用程序的摘要我知道序列可以与汇总一起使用,但它会给出求和值显示在哪个应用程序中的摘要。这种显示逻辑属于应用程序端的应用程序层,只是呈现我在应用程序端显示的值而已。摘要就像地区供应一样,我刚刚给出了样本数据@NickBaileywell,然后更改了应用程序代码是的,我们可以在前端实现这一点,但我只是在考虑T-SQL方面,但这里是我正在寻找的代码。通过在group by之后添加HAVING val(从@T中选择max(val)),您可以在结尾处丢失额外的空行。是否有可能实现每一行的摘要sequence@mohan111 . . . 使用
汇总
分组集
。这些是用于此目的的预期函数。是的,我们可以在前端实现这一点,但我只是在考虑T-SQL方面的可能性,但下面是我正在寻找的代码,通过添加have val(从@T中选择max(val))可以在末尾丢失额外的空行小组讨论结束后,是否有可能对每个小组进行总结sequence@mohan111 . . . 使用
汇总
分组集
。我的答案标题是“这有效:”,我只是说我的答案有效,它是否可靠?没有,但您可以很容易地按问题解决订单。=)是的,我同意你的看法,我们是否有可能对每个序列进行汇总是的,你可以再进行一次合并,然后使用GRP列将它们“分组”在一起。你在总结什么?每个val的记录数?val 420+420的总数=840就像每个序列的总数一样我的答案标题是“这有效:”,我只是说我的答案有效,它是可靠的吗?没有,但您可以很容易地按问题解决订单。=)是的,我同意你的看法,我们是否有可能对每个序列进行汇总是的,你可以再进行一次合并,然后使用GRP列将它们“分组”在一起。你在总结什么?记录的数量