SqlServer中连续号及断号查询—附源码

效果如下图所示:  

SqlServer中连续号及断号查询SQL如下:

--1.定义临时表
DECLARE @TestTemp TABLE(
		TestCode NVARCHAR(50),
		TestNum INT 
)

DECLARE @DataTemp TABLE(
		TestCode NVARCHAR(50),
		TestNumStr NVARCHAR(100)
)

--2.插入测试数据
INSERT INTO @TestTemp(TestCode,TestNum)
VALUES
('Code001',2),('Code001',3),('Code001',4),('Code001',6),('Code001',8),('Code001',9),
('Code002',20),('Code002',15),('Code002',16),('Code002',17),('Code002',10),('Code002',21)

--3.连续号处理后插入临时表
INSERT INTO @DataTemp(TestCode,TestNumStr)
SELECT TestCode,
	   (CASE WHEN MAX(b.TestNum)>MIN(b.TestNum) 
		    THEN CAST(MIN(b.TestNum) AS NVARCHAR(10))+'~'+CAST(MAX(b.TestNum) AS NVARCHAR(10)) 
			ELSE CAST(MIN(b.TestNum) AS NVARCHAR(10)) 
	   END) AS TestNumStr
FROM (
        select a.*,(a.TestNum-ROW_NUMBER() OVER(ORDER BY a.TestCode)) cc
        from (
               SELECT TOP 100 t.TestCode,t.TestNum 
			   FROM @TestTemp AS t
			   ORDER BY t.TestCode,t.TestNum
        ) a
)  b
group by b.TestCode,b.cc

--4.查询最终结果
SELECT * FROM @DataTemp

--5.查询最终结果:按照Code分组,连续号列转行
SELECT TestCode,TestNumStr=STUFF((SELECT ','+tt.TestNumStr FROM @DataTemp AS tt WHERE tt.TestCode=t.TestCode FOR XML PATH('')),1,1,'')
FROM @DataTemp AS t
GROUP BY TestCode

--6.断号查询 方式1
SELECT * FROM @TestTemp AS a 
WHERE NOT EXISTS(SELECT * FROM @TestTemp b WHERE b.TestNum = a.TestNum + 1)
	  AND TestNum < (SELECT MAX(TestNum) FROM @TestTemp) 

--7.断号查询  方式2
SELECT a.TestCode,a.TestNum+1 AS TestNum
FROM @TestTemp AS a 
WHERE NOT EXISTS(SELECT * FROM @TestTemp b WHERE b.TestNum = a.TestNum + 1)
	  AND TestNum < (SELECT MAX(TestNum) FROM @TestTemp) 
ORDER BY a.TestCode,a.TestNum

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咏絮v

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值