select * from 表
order by case when 字段=某条记录的字段值 then 2 else 1 end

解决方案 »

  1.   

    select * from t1 where …… order by case when 主键=具体的值 then 9 else 1 end楼上的大哥你都有星了,怎么还这么积极啊?
      

  2.   

    换思路拉
    select * from 表 where 记录标识<> 你要排最后的那条记录标识 
    Union all
    select * from 表 where 记录标识= 你要排最后的那条记录标识
      

  3.   

    order by case when ... then ...else ... end,这种方法灵活!
      

  4.   

    用CASE的方法试过了,不行,不知道是不是用UNION的原因,以下是我的SQL语句,是用来统计工资的,而且可以在每个部门下面有小计,最后还有一个总计,但由于部门名称可能会大于“总合计”这个字符串,所以总合计有时不能排在最后,不知道还有无其他方法?SELECT 时间,部门名称,SUM(定额工资) 定额工资,SUM(基本工资) 基本工资
    FROM vFnSalary 
    GROUP BY 时间,部门名称
    UNION
    SELECT NULL,(CASE WHEN GROUPING(部门名称)=1 THEN  '总合计:' ELSE  部门名称 +'->小计:' END ),
    SUM(定额工资),SUM(基本工资)
    FROM vFnSalary 
    GROUP BY 部门名称 WITH ROLLUP
    ORDER BY 部门名称 -- 直接用这句是可以排序的,但如果有一个部门名称的字符大于“总合计”的话,如:“总经理室”之类的,就会排在“总合计”的前面-- 如果加这句就会报错
    --“服务器: 消息 104,级别 15,状态 1,行 1
    -- 如果语句中包含 UNION 运算符,那么 ORDER BY 子句中的项就必须出现在选择列表中。”
    -- ORDER BY CASE WHEN 部门名称='总合计:' THEN 1 ELSE 2 END 如果我不用UNION的话,使用ORDER BY CASE 是可以的,再次求助各位了!谢谢。
      

  5.   

    按定额工资(升序)排序啊﹐總合計最大﹐肯定排在最后的另建議樓主用union all﹐速度會快些
      

  6.   

    TO:rockyljt(江濤),如果按定额工资来排序的话,就没有顺序了,就会变成如下这个样子。
    2004-10-15  总经室            14500.0000  14485.4167
    2004-10-15  销售一部          15100.0000  16959.7242
    2004-11-15  销售一部          15100.0000  17005.3847
    2004-12-15  销售一部          15100.0000  18208.0385
    2004-11-15  技术部            16100.0000  15800.2308
    2004-12-15  技术部            16100.0000  16481.0001
    2004-10-15  技术部            16300.0000  16046.0833
    2004-10-15  船用制造部        16500.0000  19058.3077
    2004-10-15  电器制造部        17800.0000  18121.4360
    2004-11-15  电器制造部        17800.0000  19288.0770
    2004-12-15  电器制造部        17800.0000  20113.0769
    NULL        船用制造部->小计: 42650.0000  47416.3077
    NULL        销售一部->小计:   45300.0000  52173.1474
    NULL        技术部->小计:     48500.0000  48327.3142
    NULL        总合计:           464350.0000 494198.2504而我要的是这样的效果:2004-10-15  行政部            10700.0000  11721.8011
    2004-11-15  行政部            10700.0000  11539.8077
    2004-12-15  行政部            10800.0000  11892.2306
    NULL        行政部->小计:     32200.0000  35153.8394
    2004-10-15  装配车间          1650.0000   2052.6154
    2004-11-15  装配车间          2450.0000   2638.2308
    2004-12-15  装配车间          2450.0000   3163.6153
    NULL        装配车间->小计:   6550.0000   7854.4615
    NULL        总合计:           464350.0000 494198.2504  <---- 就这里会排到上面去了,郁闷。
    2004-10-15  总经室            14500.0000  14485.4167
    2004-11-15  总经室            12700.0000  12686.5385
    2004-12-15  总经室            12700.0000  12700.0000
    NULL        总经室->小计:     39900.0000  39871.9552
      

  7.   

    select * from
    (
      SELECT 时间,部门名称,SUM(定额工资) 定额工资,SUM(基本工资) 基本工资
      FROM vFnSalary 
      GROUP BY 时间,部门名称
      UNION
      SELECT NULL,(CASE WHEN GROUPING(部门名称)=1 THEN  '总合计:' ELSE  部门名称 +'->小计:' END ),
      SUM(定额工资),SUM(基本工资)
      FROM vFnSalary 
      GROUP BY 部门名称 WITH ROLLUP
      ORDER BY 部门名称
    )t
    ORDER BY CASE WHEN 部门名称='总合计:' THEN 1 ELSE 2 END
      

  8.   

    select 时间,部门名称,SUM(定额工资) 定额工资,SUM(基本工资) 基本工资 from
    (
    SELECT 时间,部门名称,SUM(定额工资) 定额工资,SUM(基本工资) 基本工资
    FROM vFnSalary 
    GROUP BY 时间,部门名称
    UNION
    SELECT NULL,(CASE WHEN GROUPING(部门名称)=1 THEN  '总合计:' ELSE  部门名称 +'->小计:' END ),
    SUM(定额工资),SUM(基本工资)
    FROM vFnSalary 
    GROUP BY 部门名称 WITH ROLLUP) a
    ORDER BY case 部门名称 when '总合计:' then '1' else then '2' end
      

  9.   

    To:vivianfdlpw(),谢谢先,这样虽然总合计是排到最后了,但结果和刚刚第一种方式差不多,一样没有顺序,而且还得加 TOP 100 PERCENT 才可以。欢迎大家继续讨论。
      

  10.   

    To: tangqijun199(撒旦) ,这个结果和 vivianfdlpw() 的一样。
      

  11.   

    ...
    ...
    ORDER BY case 部门名称 when '总合计:' then '1' else then '2' end,
             case when charindex('->',部门名称)>0 then 
                  left(部门名称,charindex('->',部门名称)-1) 
                  else 部门名称 
             end,
             时间
      

  12.   

    ...
    ...
    ORDER BY case 部门名称 when '总合计:' then '1' else then '2' end,
             case when charindex('->',部门名称)>0 then 
                  left(部门名称,charindex('->',部门名称)-1) 
                  else 部门名称 
             end,
             case when charindex('->',部门名称)>0 then 
                  1 else 0 
             end,
             时间
      

  13.   

    那試一下這個吧﹕
    SELECT 部门名称,时间,SUM(定额工资) 定额工资,SUM(基本工资) 基本工资
    FROM vFnSalary 
    GROUP BY 时间,部门名称
    UNION ALL 
    SELECT (CASE WHEN GROUPING(部门名称)=1 THEN  '总合计:' ELSE  部门名称 +'->小计:' END ) as 部门名称,NULL as 时间,
    SUM(定额工资),SUM(基本工资)
    FROM vFnSalary 
    GROUP BY 部门名称
    order by 部门名称,SUM(定额工资)
      

  14.   

    try:select * from
    (
      SELECT 时间,部门名称,SUM(定额工资) 定额工资,SUM(基本工资) 基本工资
      FROM vFnSalary 
      GROUP BY 时间,部门名称
      UNION
      SELECT top 100 percent NULL,(CASE WHEN GROUPING(部门名称)=1 THEN  '总合计:' ELSE  部门名称 +'->小计:' END ),
      SUM(定额工资),SUM(基本工资)
      FROM vFnSalary 
      GROUP BY 部门名称 WITH ROLLUP
      ORDER BY 部门名称
    )t
    ORDER BY CASE 
             WHEN 部门名称 like '总经室%' THEN 3 
             WHEN 部门名称 like '总合计%' THEN 2 
             ELSE 1
             END,
             部门名称
      

  15.   

    谢谢 lsxaa(小李铅笔刀(没测试)) 的方法,我刚才也用另一种方式来实现了,就是加上一列排序,呵呵。SELECT 时间,部门名称,SUM(定额工资) 定额工资,SUM(基本工资) 基本工资,0 排序
    FROM vFnSalary 
    GROUP BY 时间,部门名称
    UNION ALL
    SELECT NULL,(CASE WHEN GROUPING(部门名称)=1 THEN  '总合计:' ELSE  部门名称 +'->小计:' END ) 部门名称,
    SUM(定额工资),SUM(基本工资),GROUPING(部门名称) 排序
    FROM vFnSalary 
    GROUP BY 部门名称 WITH ROLLUP
    ORDER BY 排序,部门名称结帐喽,谢谢各位的热心帮助!
      

  16.   

    vivianfdlpw() 最后的方法也可以实现,不过那个2和3要换一下位置,呵呵。
    rockyljt(江濤) 的方法要在GROUP BY后加 WITH ROLLUP才可以用,不过那个 总合计还是在总经室上面,呵呵。还是很谢谢各位。