SQL-使用特定的“排序依据”命令

时间:2019-06-07 10:34:12

标签: sql sql-server

我的查询;

select *
from
(
    Select distinct Siparisler.IsEmriNo,MakinelerVeParcalar.Ozellik,DurumBilgisi.ID
    from Siparisler,MakinelerVeParcalar,DurumBilgisi Where DurumBilgisi.ID = MakinelerVeParcalar.ID and Siparisler.IsEmriNo = MakinelerVeParcalar.IsEmriNo
) x
order by
    case when IsEmriNo LIKE '%OC%' then 0
         when IsEmriNo LIKE '%SB%' then 1
         when IsEmriNo LIKE '%MR%' then 2 end,
    IsEmriNo

我的输出;

IsEmriNo    Ozellik    ID
--------    -------    --
OC19U001    Ozel       1
OC19U002    Yok        2
OC19U003    Yok        3
SB19U001    Yok        4
SB19U002    Yok        5
MR19U001    Yok        6
MR19U002    Yok        7
MR19U003    Yok        8

但是我想要;

IsEmriNo    Ozellik    ID
--------    -------    --
OC19U003    Yok        3
OC19U002    Yok        2
OC19U001    Ozel       1
SB19U003    Yok        5
SB19U002    Yok        4
MR19U003    Yok        8
MR19U002    Yok        7
MR19U001    Yok        6

我想用'case'命令订购最后3个字符,再订购前2个字符。我不能用case左右命令。请帮助我...谢谢。.

3 个答案:

答案 0 :(得分:2)

嗯。如果我理解正确,您想基于前五个字符(或可能是前两个-不清楚)按最小ID排序。然后id下降。

您可以使用窗口功能来做到这一点:

order by min(id) over (partition by left(IsEmriNo, 5)),
         id desc

如果要按IsEmriNo中的最后两个字符排序:

order by min(id) over (partition by left(IsEmriNo, 5)),
         right(IsEmriNo, 2) desc

答案 1 :(得分:2)

我建议您只按当前排序的第二级顺序降序,其余的保持不变:

ORDER BY
    CASE WHEN IsEmriNo LIKE '%OC%' THEN 0
         WHEN IsEmriNo LIKE '%SB%' THEN 1
         WHEN IsEmriNo LIKE '%MR%' THEN 2 END,
    IsEmriNo DESC;

实际上,您实际上可能只想使用id DESC,但是巧合的是idIsEmriNo列以相同的顺序排序。

答案 2 :(得分:0)

uploadImages()中将SUBSTRING()PATINDEX()一起使用会有所帮助:

ORDER BY