我有一个表,其中有两列数据是这样的:单双  号码
单号    1
单号    3
单号    5
双号    6
双号    4
双号    2我想这样排序,先排序“单双”列,然后,如果“单双”列的值为“单号”,则“号码”列从高到低排序;如果“单双”列的值为“双号”,则“号码”列从低到高排序,那么我需要的结果就这样:单双  号码
单号    5
单号    3
单号    1
双号    2
双号    4
双号    6请大家帮忙解决下,谢谢了!

解决方案 »

  1.   

    if object_id('[tb]') is not null drop table [tb]
    go
    create table [tb]([单双] varchar(4),[号码] int)
    insert [tb]
    select '单号',1 union all
    select '单号',3 union all
    select '单号',5 union all
    select '双号',6 union all
    select '双号',4 union all
    select '双号',2
    goselect * from tb
    order by case when 单双='单号' then 1 else 2 end,
    case when  单双='单号' then 号码 else -号码 end desc/**
    单双   号码
    ---- -----------
    单号   5
    单号   3
    单号   1
    双号   2
    双号   4
    双号   6(6 行受影响)
    **/
      

  2.   

    如果数据量较大,建议用union all 分别取结果集的方式较好。
      

  3.   

    运行结果是正确的,但case when  单双='单号' then 号码 else -号码 end desc
    这个地方没有弄明白是什么意思,能否解释一下,谢谢
      

  4.   

    SELECT * FROM TB
    ORDER BY case when  单双='单号' then 号码 else -号码 end desc
    这一个就可以实现了吧,为什么一楼要写两个阿?
      

  5.   

    运行结果是正确的,但case when 单双='单号' then 号码 else -号码 end desc
    个人理解:
    如果为单号就为正数,如果为双号就为负数
    在Desc 排序 
    会将单号放到前面,双号放在后面例如1
    3
    5
    2
    4
    6排序如下:
    5
    3
    1
    -2
    -4
    -6