select * from t1 where …… order by case when 主键=具体的值 then 9 else 1 end楼上的大哥你都有星了,怎么还这么积极啊?
换思路拉 select * from 表 where 记录标识<> 你要排最后的那条记录标识 Union all select * from 表 where 记录标识= 你要排最后的那条记录标识
order by case when ... then ...else ... end,这种方法灵活!
用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 是可以的,再次求助各位了!谢谢。
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
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
To:vivianfdlpw(),谢谢先,这样虽然总合计是排到最后了,但结果和刚刚第一种方式差不多,一样没有顺序,而且还得加 TOP 100 PERCENT 才可以。欢迎大家继续讨论。
To: tangqijun199(撒旦) ,这个结果和 vivianfdlpw() 的一样。
... ... ORDER BY case 部门名称 when '总合计:' then '1' else then '2' end, case when charindex('->',部门名称)>0 then left(部门名称,charindex('->',部门名称)-1) else 部门名称 end, 时间
... ... 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, 时间
那試一下這個吧﹕ 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(定额工资)
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, 部门名称
谢谢 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 排序,部门名称结帐喽,谢谢各位的热心帮助!
vivianfdlpw() 最后的方法也可以实现,不过那个2和3要换一下位置,呵呵。 rockyljt(江濤) 的方法要在GROUP BY后加 WITH ROLLUP才可以用,不过那个 总合计还是在总经室上面,呵呵。还是很谢谢各位。
select * from 表 where 记录标识<> 你要排最后的那条记录标识
Union all
select * from 表 where 记录标识= 你要排最后的那条记录标识
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 是可以的,再次求助各位了!谢谢。
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
(
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
(
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
...
ORDER BY case 部门名称 when '总合计:' then '1' else then '2' end,
case when charindex('->',部门名称)>0 then
left(部门名称,charindex('->',部门名称)-1)
else 部门名称
end,
时间
...
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,
时间
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(定额工资)
(
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,
部门名称
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 排序,部门名称结帐喽,谢谢各位的热心帮助!
rockyljt(江濤) 的方法要在GROUP BY后加 WITH ROLLUP才可以用,不过那个 总合计还是在总经室上面,呵呵。还是很谢谢各位。