问一个关于order by 和case when的问题,求大神解惑

[复制链接]
查看11 | 回复5 | 2021-1-27 06:45:08 | 显示全部楼层 |阅读模式


菜鸟小白,想问一下为什么执行结果没有按照SQL语句的来执行
分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:45:08 | 显示全部楼层
你这得动态执行,类似下面的代码,不过MYSQL不是很清楚。但是,你这逻辑好像有些问题,是不是得不同ID的各自进行查询再合并。

DECLARE@SQL
SET@SQL='SELECT.....ORDERBY'+CASEWHENID=1THEN'STOCKNODESC'ELSE'STOCKNO'END

EXEC(@SQL)

回复

使用道具 举报

千问 | 2021-1-27 06:45:08 | 显示全部楼层
这是搞笑来的吧,同一个字段在一个语句里面给定不同的排序方式?

回复

使用道具 举报

千问 | 2021-1-27 06:45:08 | 显示全部楼层
提供一种参考写法,不一定符合你的预期结果。
withtmpas
(select1asp_id,1asp_rev,'Z01'asp_nofromdual
unionall
select2asp_id,1asp_rev,'Z02'asp_nofromdual
unionall
select1asp_id,2asp_rev,'Z03'asp_nofromdual
unionall
select2asp_id,2asp_rev,'Z05'asp_nofromdual
unionall
select1asp_id,3asp_rev,'Z04'asp_nofromdual)
SELECT*
FROMTMP
ORDERBYCASE
WHENTMP.P_ID=1THEN
TMP.P_NO
ELSE
null
ENDdesc,
CASE
WHENTMP.P_ID=2THEN
TMP.P_NO
ELSE
null
ENDasc;
回复

使用道具 举报

千问 | 2021-1-27 06:45:08 | 显示全部楼层
selectid
frompub_products
orderby(casewhenid
数字列可以用这种方式排列,但字符列我也无能为力
回复

使用道具 举报

千问 | 2021-1-27 06:45:08 | 显示全部楼层
用字符替换后转类型进行排序
;withtas(
select1asid,1asrev,''ascontent,'z01'asstockNO
unionallselect2,1,'','z02'
unionallselect1,2,'','z03'
unionallselect2,2,'','z04'
unionallselect1,3,'','z05'
)
select*fromt
orderby(casewhenid=1then0-convert(int,replace(stockNO,'z',''))elseconvert(int,replace(stockNO,'z',''))end)

或者先排序,得到排序序号后,再次排序
;withtas(
select1asid,1asrev,''ascontent,'z01'asstockNO
unionallselect2,1,'','z02'
unionallselect1,2,'','z03'
unionallselect2,2,'','z04'
unionallselect1,3,'','z05'
)
select*from(
select*,row_number()over(orderbystockNO)asrowidfromt
)a
orderby(casewhenid=1then0-rowidelserowidend)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行