sql union order by 排序问题

wwttqq85538649 2011-05-13 04:30:43
当我使用union 以及order by 进行分组排序时,若出现多个union ,那么排序就会有问题,先上代码

以下代码是:先按type分组,然后再排序,最后合并。但当运行时,出现type的顺序是1,1,1,1,1,2,2,2,3,2,2,2,3,但是当我把type1删掉时,显示type的顺序为:2,2,2,2,2,2,3,3.这说明各个分组是相互影响的。请高手帮忙,看问题出现在哪?



select * from(
select top 100000 id, businessNum,replace( replace( convert(varchar(10),exportTime,102),datename(yyyy,exportTime)+'.','')+datename(dw,exportTime),+'星期','')as exportTime,shipSide,shipOwner,destinationPort,forwarder,addressLation, replace( replace( convert(varchar(20),arrivalTime,102),datename(yyyy,arrivalTime)+'.','')+datename(dw,arrivalTime)+right('0'+datename(hh,arrivalTime),2),'星期','')as arrivalTime,billNum,containerType,containerNum,seal,customFee,trucking,forwarderFee,otherfee,hexiao,closeBill,commodity,customAmount,billAmount,rebateRate,rebateAmount,rebateNum,specialNum,type
from counter
where type = 1 and year(exportTime) = year(getdate())
order by businessNum,billNum) as a

union

select * from(
select top 100000 id, businessNum,replace( replace( convert(varchar(10),exportTime,102),datename(yyyy,exportTime)+'.','')+datename(dw,exportTime),+'星期','')as exportTime,shipSide,shipOwner,destinationPort,forwarder,addressLation, replace( replace( convert(varchar(20),arrivalTime,102),datename(yyyy,arrivalTime)+'.','')+datename(dw,arrivalTime)+right('0'+datename(hh,arrivalTime),2),'星期','')as arrivalTime,billNum,containerType,containerNum,seal,customFee,trucking,forwarderFee,otherfee,hexiao,closeBill,commodity,customAmount,billAmount,rebateRate,rebateAmount,rebateNum,specialNum,type
from counter
where type = 2 and year(exportTime) = year(getdate())
order by businessNum,billNum) as b

union
select * from(
select top 100000 id, businessNum,replace( replace( convert(varchar(10),exportTime,102),datename(yyyy,exportTime)+'.','')+datename(dw,exportTime),+'星期','')as exportTime,shipSide,shipOwner,destinationPort,forwarder,addressLation, replace( replace( convert(varchar(20),arrivalTime,102),datename(yyyy,arrivalTime)+'.','')+datename(dw,arrivalTime)+right('0'+datename(hh,arrivalTime),2),'星期','')as arrivalTime,billNum,containerType,containerNum,seal,customFee,trucking,forwarderFee,otherfee,hexiao,closeBill,commodity,customAmount,billAmount,rebateRate,rebateAmount,rebateNum,specialNum,type
from counter
where type = 3 and year(exportTime) = year(getdate())
order by businessNum,billNum) as c
union

select * from(
select top 100000 id, businessNum,replace( replace( convert(varchar(10),exportTime,102),datename(yyyy,exportTime)+'.','')+datename(dw,exportTime),+'星期','')as exportTime,shipSide,shipOwner,destinationPort,forwarder,addressLation, replace( replace( convert(varchar(20),arrivalTime,102),datename(yyyy,arrivalTime)+'.','')+datename(dw,arrivalTime)+right('0'+datename(hh,arrivalTime),2),'星期','')as arrivalTime,billNum,containerType,containerNum,seal,customFee,trucking,forwarderFee,otherfee,hexiao,closeBill,commodity,customAmount,billAmount,rebateRate,rebateAmount,rebateNum,specialNum,type
from counter
where type = 4 and year(exportTime) = year(getdate())
order by businessNum,billNum)as d
union


select * from(
select top 100000 id, businessNum,replace( replace( convert(varchar(10),exportTime,102),datename(yyyy,exportTime)+'.','')+datename(dw,exportTime),+'星期','')as exportTime,shipSide,shipOwner,destinationPort,forwarder,addressLation, replace( replace( convert(varchar(20),arrivalTime,102),datename(yyyy,arrivalTime)+'.','')+datename(dw,arrivalTime)+right('0'+datename(hh,arrivalTime),2),'星期','')as arrivalTime,billNum,containerType,containerNum,seal,customFee,trucking,forwarderFee,otherfee,hexiao,closeBill,commodity,customAmount,billAmount,rebateRate,rebateAmount,rebateNum,specialNum,type
from counter
where type = 5 and year(exportTime) = year(getdate())
order by businessNum,billNum)as e

union

select * from(
select top 100000 id, businessNum,replace( replace( convert(varchar(10),exportTime,102),datename(yyyy,exportTime)+'.','')+datename(dw,exportTime),+'星期','')as exportTime,shipSide,shipOwner,destinationPort,forwarder,addressLation, replace( replace( convert(varchar(20),arrivalTime,102),datename(yyyy,arrivalTime)+'.','')+datename(dw,arrivalTime)+right('0'+datename(hh,arrivalTime),2),'星期','')as arrivalTime,billNum,containerType,containerNum,seal,customFee,trucking,forwarderFee,otherfee,hexiao,closeBill,commodity,customAmount,billAmount,rebateRate,rebateAmount,rebateNum,specialNum,type
from counter
where type =6 and year(exportTime) = year(getdate())
order by businessNum,billNum) as f
union

select * from(
select top 100000 id, businessNum,replace( replace( convert(varchar(10),exportTime,102),datename(yyyy,exportTime)+'.','')+datename(dw,exportTime),+'星期','')as exportTime,shipSide,shipOwner,destinationPort,forwarder,addressLation, replace( replace( convert(varchar(20),arrivalTime,102),datename(yyyy,arrivalTime)+'.','')+datename(dw,arrivalTime)+right('0'+datename(hh,arrivalTime),2),'星期','')as arrivalTime,billNum,containerType,containerNum,seal,customFee,trucking,forwarderFee,otherfee,hexiao,closeBill,commodity,customAmount,billAmount,rebateRate,rebateAmount,rebateNum,specialNum,type
from counter
where type = 7 and year(exportTime) = year(getdate())
order by case when arrivalTime is null then 1 else 0 end,businessNum,billNum)as g
union

select * from(
select top 100000 id, businessNum,replace( replace( convert(varchar(10),exportTime,102),datename(yyyy,exportTime)+'.','')+datename(dw,exportTime),+'星期','')as exportTime,shipSide,shipOwner,destinationPort,forwarder,addressLation, replace( replace( convert(varchar(20),arrivalTime,102),datename(yyyy,arrivalTime)+'.','')+datename(dw,arrivalTime)+right('0'+datename(hh,arrivalTime),2),'星期','')as arrivalTime,billNum,containerType,containerNum,seal,customFee,trucking,forwarderFee,otherfee,hexiao,closeBill,commodity,customAmount,billAmount,rebateRate,rebateAmount,rebateNum,specialNum,type
from counter
where type = 8 and year(exportTime) = year(getdate())
order by case when arrivalTime is null then 1 else 0 end,businessNum,billNum)as h

union

select * from(
select top 100000 id, businessNum,replace( replace( convert(varchar(10),exportTime,102),datename(yyyy,exportTime)+'.','')+datename(dw,exportTime),+'星期','')as exportTime,shipSide,shipOwner,destinationPort,forwarder,addressLation, replace( replace( convert(varchar(20),arrivalTime,102),datename(yyyy,arrivalTime)+'.','')+datename(dw,arrivalTime)+right('0'+datename(hh,arrivalTime),2),'星期','')as arrivalTime,billNum,containerType,containerNum,seal,customFee,trucking,forwarderFee,otherfee,hexiao,closeBill,commodity,customAmount,billAmount,rebateRate,rebateAmount,rebateNum,specialNum,type
from counter
where type = 9 and year(exportTime) = year(getdate()) )as i
union

select * from(
select top 100000 id, businessNum,replace( replace( convert(varchar(10),exportTime,102),datename(yyyy,exportTime)+'.','')+datename(dw,exportTime),+'星期','')as exportTime,shipSide,shipOwner,destinationPort,forwarder,addressLation, replace( replace( convert(varchar(20),arrivalTime,102),datename(yyyy,arrivalTime)+'.','')+datename(dw,arrivalTime)+right('0'+datename(hh,arrivalTime),2),'星期','')as arrivalTime,billNum,containerType,containerNum,seal,customFee,trucking,forwarderFee,otherfee,hexiao,closeBill,commodity,customAmount,billAmount,rebateRate,rebateAmount,rebateNum,specialNum,type
from counter
where type = 10 and year(exportTime) = year(getdate()) )as j







...全文
872 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
obuntu 2011-05-16
  • 打赏
  • 举报
回复
搞到一个临时表,我就不信不行了。

另外,为毛不搞个in呢。这么多个union all ~~
叶子 2011-05-15
  • 打赏
  • 举报
回复
整体嵌套,就是最外面再嵌套上一层。
  • 打赏
  • 举报
回复


帮顶
wwttqq85538649 2011-05-15
  • 打赏
  • 举报
回复
这样还是不行的。排序还是会有问题的。
[Quote=引用 4 楼 maco_wang 的回复:]

嵌套一下,把所有的union all都放在里面,再order by
[/Quote]
wwttqq85538649 2011-05-15
  • 打赏
  • 举报
回复
可是每一个union的排序方式不一样。
[Quote=引用 3 楼 gogodiy 的回复:]

UNION的时候不要ORDER BY,等全部UNION好了再统一使用ORDER BY
[/Quote]
wwttqq85538649 2011-05-15
  • 打赏
  • 举报
回复
顺序还是会有问题的。


当用三个union进行order时,排序会出现问题。
有一些union并不能排序
[Quote=引用 2 楼 fredrickhu 的回复:]

把整个括起来再外面嵌套一层以后再ORDER BY
[/Quote]
wwttqq85538649 2011-05-15
  • 打赏
  • 举报
回复

恩,在最外面又嵌套一层了。可排序还是有问题。[Quote=引用 9 楼 maco_wang 的回复:]

整体嵌套,就是最外面再嵌套上一层。
[/Quote]
--小F-- 2011-05-13
  • 打赏
  • 举报
回复
把整个括起来再外面嵌套一层以后再ORDER BY
xuexiaodong2009 2011-05-13
  • 打赏
  • 举报
回复
为什么不写一个函数处理呢
叶子 2011-05-13
  • 打赏
  • 举报
回复
嵌套一下,把所有的union all都放在里面,再order by
gogodiy 2011-05-13
  • 打赏
  • 举报
回复
UNION的时候不要ORDER BY,等全部UNION好了再统一使用ORDER BY

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧