求大佬帮忙看看关于sql查询排序的问题,头都快想秃了

bxjt123 2020-12-14 10:10:30
排序前的数据 → 需要得到排序后的数据

上面是排序的一个规则,尝试过很多,总是有一两个字段排序不了,希望大佬帮帮忙。
...全文
125 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
锟斤拷锟斤拷 2020-12-15
  • 打赏
  • 举报
回复
引用 4 楼 bxjt123 的回复:
[quote=引用 1 楼 雨夹雪 的回复:]


CREATE TABLE #T
(
	id INT,
	city VARCHAR(10),
	name VARCHAR(10),
	score INT 
)


INSERT INTO #T VALUES(1,'a','A',100)
INSERT INTO #T VALUES(2,'a','A-1',80)
INSERT INTO #T VALUES(3,'b','C',70)
INSERT INTO #T VALUES(4,'a','A-2',90)
INSERT INTO #T VALUES(5,'b','D',85)
INSERT INTO #T VALUES(6,'b','B',75)
INSERT INTO #T VALUES(7,'b','E',30)
INSERT INTO #T VALUES(8,'b','B-1',30)
INSERT INTO #T VALUES(9,'a','F',98)
INSERT INTO #T VALUES(10,'b','G',65)

SELECT id,city,name,score FROM 
(
SELECT *, (SELECT score FROM #t WHERE name = LEFT(a.name,1)  ) AS x FROM #T a 
) a  ORDER  BY city, x DESC,id     
 

啊不好意思 可能是我没表述清楚,就是 name 字段的A B C是泛指 不止一位数,A-1 2 3后面的1 2 3也不止一位数,不过 - 标识是固定有的。试了下对于示例数据可以排序,换成真实数据会有些偏差。不过还是很感谢,我也再研究研究,如果大佬也有新的方法,那还麻烦帮忙啦。[/quote] 用charindex找一下'-'的位置然后-1就好了啊 你把#1的LEFT(a.name,1)换成LEFT(a.name,CHARINDEX('-',a.name)-1)试试呢
bxjt123 2020-12-15
  • 打赏
  • 举报
回复
实在不好意思,可能是我没表述清楚,就是 name 字段的A B C是泛指 不止一位数,A-1 2 3后面的1 2 3也不止一位数,不过 - 标识是固定有的。因此换一下数据更正一下,还麻烦各位大佬啦
bxjt123 2020-12-15
  • 打赏
  • 举报
回复
CREATE TABLE #T
(
    id INT,
    city VARCHAR(10),
    name VARCHAR(20),
    score INT 
)

INSERT INTO #T VALUES(1,'港城','奶茶',100)
INSERT INTO #T VALUES(2,'港城','奶茶-一店',80)
INSERT INTO #T VALUES(3,'龙海湾','小吃',70)
INSERT INTO #T VALUES(4,'港城','奶茶-二店',90)
INSERT INTO #T VALUES(5,'龙海湾','健身',85)
INSERT INTO #T VALUES(6,'龙海湾','KFC',75)
INSERT INTO #T VALUES(7,'龙海湾','农家乐',30)
INSERT INTO #T VALUES(8,'龙海湾','KFC-小路口店',30)
INSERT INTO #T VALUES(9,'港城','电影院',98)
INSERT INTO #T VALUES(10,'龙海湾','密室逃脱',65)
不好意思第一次发帖 忘记给大家示例数据的代码了
「已注销」 2020-12-15
  • 打赏
  • 举报
回复
帮顶一下,顺便学习一下
bxjt123 2020-12-15
  • 打赏
  • 举报
回复
引用 3 楼 兔子党党务院院长 的回复:

select a.*
  from tb a
  join (select city,name,max(score) as max_score from tb where length(name) = 1 group by city,name) b
    on a.city = b.city and left(a.name,1) = b.name
order by a.city,b.max_score desc,left(replace(a.name,'-','') + '0000',4)
啊不好意思 可能是我没表述清楚,就是 name 字段的A B C是泛指 不止一位数,A-1 2 3后面的1 2 3也不止一位数,不过 - 标识是固定有的。试了下对于示例数据可以正确排序,换成真实数据会有些不太符合预期。不过还是很感谢,我也再研究研究,如果大佬也有新的方法,那还麻烦帮忙啦。
bxjt123 2020-12-15
  • 打赏
  • 举报
回复
引用 2 楼 金色雨林 的回复:

SELECT * FROM dbo.table1
ORDER BY city 	,LEFT(name,1),id ASC,score DESC	
试试
啊不好意思 类似我的尝试过了都不太符合预期。可能是我没表述清楚,就是 name 字段的A B C是泛指 不止一位数,A-1 2 3后面的1 2 3也不止一位数,不过 - 标识是固定有的。还是很感谢啦
bxjt123 2020-12-15
  • 打赏
  • 举报
回复
引用 1 楼 雨夹雪 的回复:


CREATE TABLE #T
(
	id INT,
	city VARCHAR(10),
	name VARCHAR(10),
	score INT 
)


INSERT INTO #T VALUES(1,'a','A',100)
INSERT INTO #T VALUES(2,'a','A-1',80)
INSERT INTO #T VALUES(3,'b','C',70)
INSERT INTO #T VALUES(4,'a','A-2',90)
INSERT INTO #T VALUES(5,'b','D',85)
INSERT INTO #T VALUES(6,'b','B',75)
INSERT INTO #T VALUES(7,'b','E',30)
INSERT INTO #T VALUES(8,'b','B-1',30)
INSERT INTO #T VALUES(9,'a','F',98)
INSERT INTO #T VALUES(10,'b','G',65)

SELECT id,city,name,score FROM 
(
SELECT *, (SELECT score FROM #t WHERE name = LEFT(a.name,1)  ) AS x FROM #T a 
) a  ORDER  BY city, x DESC,id     
 

啊不好意思 可能是我没表述清楚,就是 name 字段的A B C是泛指 不止一位数,A-1 2 3后面的1 2 3也不止一位数,不过 - 标识是固定有的。试了下对于示例数据可以排序,换成真实数据会有些偏差。不过还是很感谢,我也再研究研究,如果大佬也有新的方法,那还麻烦帮忙啦。
AcHerat 2020-12-15
  • 打赏
  • 举报
回复

select a.*
  from tb a
  join (select city,name,max(score) as max_score from tb where length(name) = 1 group by city,name) b
    on a.city = b.city and left(a.name,1) = b.name
order by a.city,b.max_score desc,left(replace(a.name,'-','') + '0000',4)
金大哈 2020-12-15
  • 打赏
  • 举报
回复

SELECT * FROM dbo.table1
ORDER BY city 	,LEFT(name,1),id ASC,score DESC	
试试
ダ雨夹雪リ 2020-12-15
  • 打赏
  • 举报
回复


CREATE TABLE #T
(
	id INT,
	city VARCHAR(10),
	name VARCHAR(10),
	score INT 
)


INSERT INTO #T VALUES(1,'a','A',100)
INSERT INTO #T VALUES(2,'a','A-1',80)
INSERT INTO #T VALUES(3,'b','C',70)
INSERT INTO #T VALUES(4,'a','A-2',90)
INSERT INTO #T VALUES(5,'b','D',85)
INSERT INTO #T VALUES(6,'b','B',75)
INSERT INTO #T VALUES(7,'b','E',30)
INSERT INTO #T VALUES(8,'b','B-1',30)
INSERT INTO #T VALUES(9,'a','F',98)
INSERT INTO #T VALUES(10,'b','G',65)

SELECT id,city,name,score FROM 
(
SELECT *, (SELECT score FROM #t WHERE name = LEFT(a.name,1)  ) AS x FROM #T a 
) a  ORDER  BY city, x DESC,id     
 

bxjt123 2020-12-15
  • 打赏
  • 举报
回复
那差不多结贴啦,蟹蟹各位大佬帮忙
bxjt123 2020-12-15
  • 打赏
  • 举报
回复
绝了。我刚刚case when试了半天可能括号或者语法不太对没试出来。一楼的原理真的妙啊
锟斤拷锟斤拷 2020-12-15
  • 打赏
  • 举报
回复

CREATE TABLE #T
(
    id INT,
    city VARCHAR(10),
    name VARCHAR(20),
    score INT 
)
 
INSERT INTO #T VALUES(1,'港城','奶茶',100)
INSERT INTO #T VALUES(2,'港城','奶茶-一店',80)
INSERT INTO #T VALUES(3,'龙海湾','小吃',70)
INSERT INTO #T VALUES(4,'港城','奶茶-二店',90)
INSERT INTO #T VALUES(5,'龙海湾','健身',85)
INSERT INTO #T VALUES(6,'龙海湾','KFC',75)
INSERT INTO #T VALUES(7,'龙海湾','农家乐',30)
INSERT INTO #T VALUES(8,'龙海湾','KFC-小路口店',30)
INSERT INTO #T VALUES(9,'港城','电影院',98)
INSERT INTO #T VALUES(10,'龙海湾','密室逃脱',65)

SELECT id,city,name,score FROM 
(
SELECT *, (SELECT score FROM #t WHERE name = LEFT(a.name,case when CHARINDEX('-',a.name)=0 then 999 else CHARINDEX('-',a.name)-1 end)  ) AS x FROM #T a 
) a  ORDER  BY city, x DESC,id 
代码基本上都是复制的一楼的

22,209

社区成员

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

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