语句中数字的顺序

ysycysyc 2018-01-22 09:17:39
各位大虾,前些天得到道素大虾的帮助解决了一个难题,但回头看又不明白,请大虾们再给指点一下,语句如下:

DECLARE @SZ0 NVARCHAR(100) = '36,37,38,39,40' --包含0个

DECLARE @SZ2 NVARCHAR(100) = '11,12,13,14,15,16,17,18,19,20' --包含2个

DECLARE @SZ23 NVARCHAR(100) = '21,22,23,24,25,26' --包含2-3个

DECLARE @SZ02 NVARCHAR(100) = '31,32,33' --不超过2个


SELECT * FROM (
SELECT a.ID,a.a,a.b,a.c,a.d,a.e,a.f--,*
,COUNT(CASE WHEN tt.id=0 THEN 1 ELSE NULL END) AS sz0

,COUNT(CASE WHEN tt.id=2 THEN 1 ELSE NULL END) AS sz2

,COUNT(CASE WHEN tt.id=23 THEN 1 ELSE NULL END) AS sz23

,COUNT(CASE WHEN tt.id=20 THEN 1 ELSE NULL END) AS sz02

FROM TMB AS a

CROSS APPLY(VALUES('a',a),('b',b),('c',c),('d',d),('e',e),('f',f)) c(t,v)

CROSS APPLY (SELECT * FROM (VALUES(0,@SZ0),(2,@SZ2),(23,@SZ23),(20,@SZ02)) s(ID,sz) WHERE CHARINDEX(','+LTRIM(c.v)+',',','+s.sz+',')>0) tt

GROUP BY a.ID,a.a,a.b,a.c,a.d,a.e,a.f

) AS t WHERE t.sz0=0 AND sz2=2 AND sz23 IN (2,3) AND sz02<2

我的疑问是,红码部分的数字颠倒了好象就不对了,是不是这样,为什么。
...全文
549 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ysycysyc 2018-01-25
  • 打赏
  • 举报
回复
感谢版主,更容易理解和运用。
中国风 2018-01-25
  • 打赏
  • 举报
回复
引用 5 楼 ysycysyc 的回复:
您的方法是不是也能实现,好象更简单些。

方法在#4,自己要动手去测,只有自己动手才能学会加入印象

用你上一贴的测试数据看效果,如:结果正确,方法明显用此贴我提供方法高效
e.g.
CREATE TABLE #TBML(ID INT IDENTITY(1,1) PRIMARY KEY ,a INT,b INT, c INT ,d INT ,e INT, f INT)
INSERT INTO #TBML(a,b,c,d,e,f)VALUES(1,2,3,4,5,6),(6,17,20,21,22,51),(10,19,20,25,26,51)

--测试数据
/*
ID a b c d e f
1 1 2 3 4 5 6
2 6 17 20 21 22 51
3 10 19 20 25 26 51
*/

DECLARE @SZ0 NVARCHAR(100) ='36,37,38,39,40'; --包含0个

DECLARE @SZ2 NVARCHAR(100) ='11,12,13,14,15,16,17,18,19,20'; --包含2个

DECLARE @SZ23 NVARCHAR(100) ='21,22,23,24,25,26'; --包含2-3个

DECLARE @SZ02 NVARCHAR(100) ='31,32,33'; --不超过2个
SELECT a.ID
, a.a
, a.b
, a.c
, a.d
, a.e
, a.f
, Condition1
, Condition2
, Condition3
, Condition4
FROM #TBML AS a
CROSS APPLY
(SELECT SUM(SIGN(CHARINDEX(','+RTRIM(col) +',', ','+@SZ0+',')))
, SUM(SIGN(CHARINDEX(','+RTRIM(col) +',', ','+@SZ2+',')))
, SUM(SIGN(CHARINDEX(','+RTRIM(col) +',', ','+@SZ23+',')))
, SUM(SIGN(CHARINDEX(','+RTRIM(col) +',', ','+@SZ02+',')))
FROM
(VALUES (b)
, (c)
, (d)
, (e)
, (f)) AS b1 (col) ) AS b(Condition1, Condition2, Condition3, Condition4)
WHERE Condition1=0
AND Condition2=2
AND Condition3 BETWEEN 2 AND 3
AND Condition4<=2;

/*--结果集
ID a b c d e f Condition1 Condition2 Condition3 Condition4
2 6 17 20 21 22 51 0 2 2 0
3 10 19 20 25 26 51 0 2 2 0
*/
ysycysyc 2018-01-25
  • 打赏
  • 举报
回复
引用 3 楼 roy_88 的回复:
有没有原贴,你是想实现字符串在每一条记录上所有栏位的记录数?如果这样可用更简洁的方法
http://bbs.csdn.net/topics/392186907 上面是原贴,目的是从TMB(本贴中的表)提取数据,条件是 DECLARE @SZ0 NVARCHAR(100) = '36,37,38,39,40' --包含0个 DECLARE @SZ2 NVARCHAR(100) = '11,12,13,14,15,16,17,18,19,20' --包含2个 DECLARE @SZ23 NVARCHAR(100) = '21,22,23,24,25,26' --包含2-3个 DECLARE @SZ02 NVARCHAR(100) = '31,32,33' --不超过2个 即:记录中包含36,37,38,39,40的个数为0,11,12,13,14,15,16,17,18,19,20的个数为2个,21,22,23,24,25,26的个数和为2个或者3个,31,32,33的个数不起过2个。 您的方法是不是也能实现,好象更简单些。
ysycysyc 2018-01-23
  • 打赏
  • 举报
回复
就是要从表TMB中筛选数据,条件是包含上面4个数组后面要求的个数
中国风 2018-01-23
  • 打赏
  • 举报
回复
用以下方法去测测

e.g.
DECLARE @SZ0 NVARCHAR(100) ='36,37,38,39,40'; --包含0个

DECLARE @SZ2 NVARCHAR(100) ='11,12,13,14,15,16,17,18,19,20'; --包含2个

DECLARE @SZ23 NVARCHAR(100) ='21,22,23,24,25,26'; --包含2-3个

DECLARE @SZ02 NVARCHAR(100) ='31,32,33'; --不超过2个
;WITH TMB
(ID, a, b, c, d, e, f)
AS
(
SELECT 1
, 10
, 20
, 30
, 40
, 50
, 60
UNION ALL
SELECT 2
, 11
, 22
, 33
, 44
, 55
, 66)
SELECT a.ID
, a.a
, a.b
, a.c
, a.d
, a.e
, a.f
, Condition1
, Condition2
, Condition3
, Condition4
FROM TMB AS a
CROSS APPLY
(SELECT SUM(SIGN(CHARINDEX(','+RTRIM(col) +',', ','+@SZ0+',')))
, SUM(SIGN(CHARINDEX(','+RTRIM(col) +',', ','+@SZ2+',')))
, SUM(SIGN(CHARINDEX(','+RTRIM(col) +',', ','+@SZ23+',')))
, SUM(SIGN(CHARINDEX(','+RTRIM(col) +',', ','+@SZ02+',')))
FROM
(VALUES (b)
, (c)
, (d)
, (e)
, (f)) AS b1 (col) ) AS b(Condition1, Condition2, Condition3, Condition4)
WHERE Condition1=0
AND Condition2=2
AND Condition3 BETWEEN 2 AND 3
AND Condition4<=2;

/*--不加条件时测试显示效果
ID a b c d e f Condition1 Condition2 Condition3 Condition4
1 10 20 30 40 50 60 1 1 0 0
2 11 22 33 44 55 66 0 0 1 1
*/
中国风 2018-01-23
  • 打赏
  • 举报
回复
有没有原贴,你是想实现字符串在每一条记录上所有栏位的记录数?如果这样可用更简洁的方法

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧