请教一个sql查询排序语句的写法,急(100分)

  • 主题发起人 主题发起人 Northwind
  • 开始时间 开始时间
N

Northwind

Unregistered / Unconfirmed
GUEST, unregistred user!
有一个ms-sqlserver的table,排序前的原始状态如下:<br>ID &nbsp;    name &nbsp;  IDup     IDkey<br>==========================<br>129 北京市 R-4 &nbsp; &nbsp; &nbsp;R-4-1<br>137 浙江省 R-4 &nbsp; &nbsp;R-4-11<br>161 朝阳区 R-4-1 &nbsp; &nbsp;R-4-1-1<br>162 杭州市 R-4-11 &nbsp; &nbsp;R-4-11-1<br>163 舟山市 R-4-11 &nbsp; &nbsp;R-4-11-125<br>164 温州市 R-4-11 &nbsp; &nbsp;R-4-11-110<br>165 安徽省 R-4 &nbsp; &nbsp;R-4-12<br>166 海淀区 R-4-1 &nbsp; &nbsp;R-4-1-2<br>167 安庆市 R-4-12 &nbsp; &nbsp;R-4-12-1<br>168 黄山市 R-4-12 &nbsp; &nbsp;R-4-12-103<br>169 铜陵市 R-4-12 &nbsp; &nbsp;R-4-12-134<br>170 芜湖市 R-4-12 &nbsp; &nbsp;R-4-12-140<br>171 合肥市 R-4-12 &nbsp; &nbsp;R-4-12-79<br>176 肥东县 R-4-12-79 &nbsp; &nbsp;R-4-12-79-1<br>………..<br><br>要求查询后的显示结果按照如下排序:<br>ID &nbsp;    name &nbsp;  IDup     IDkey<br>==========================<br>129 北京市 R-4 &nbsp; &nbsp; &nbsp;R-4-1<br>161 朝阳区 R-4-1 &nbsp; &nbsp;R-4-1-1<br>166 海淀区 R-4-1 &nbsp; &nbsp;R-4-1-2<br>137 浙江省 R-4 &nbsp; &nbsp;R-4-11<br>162 杭州市 R-4-11 &nbsp; &nbsp;R-4-11-1<br>164 温州市 R-4-11 &nbsp; &nbsp;R-4-11-110<br>163 舟山市 R-4-11 &nbsp; &nbsp;R-4-11-125<br>165 安徽省 R-4 &nbsp; &nbsp;R-4-12<br>167 安庆市 R-4-12 &nbsp; &nbsp;R-4-12-1<br>171 合肥市 R-4-12 &nbsp; &nbsp;R-4-12-79<br>176 肥东县 R-4-12-79   R-4-12-79-1<br>168 黄山市 R-4-12 &nbsp; &nbsp;R-4-12-103<br>169 铜陵市 R-4-12 &nbsp; &nbsp;R-4-12-134<br>170 芜湖市 R-4-12 &nbsp; &nbsp;R-4-12-140<br>………..<br>请问如何写sql语句
 
这个排序似乎没有规则可言,恐怕不易实现!
 
据说能够实现,没有高手吗?
 
加一个排序字段就可以了。
 
这是别人的库结构,不能修改。在数据录入时到籍贯时显示到treeView中供选择,我现在用递归方式处理显示,速度有点慢,听说有人能够用一sql查询语句就能实现显示在DBGrid中,这样可大大提高速度。
 
要不你自己寫一個表,把table中id的排序先后全都寫在一個表並以一個字段來區分先后,然后你左連接一下,以你自己定義的字段排序,也不會改變他原來的結構,只是加多一個表,這種排序在有些會計報表中碰到過,反正我都是用加多一個表定義來后左連接實現的,還有其他什么好辦法,來這里一起分享一下
 
自已增加一个地区对照表(网上有区号对地区名的资料),然后对两个表进行查询再排序
 
为什么不用最后面的字段排序???
 
比较混乱呀,一句SQL我看不容易搞定。
 
利用视图把IDkey过滤-分割符将内容拆分成5个字段,然后排序
 
我做了半天测试还是没有把结果做出来,还差点.我的SQL语句是这样写的:<br>select ID,name,IDup,IDKey from test order by substring(IDKey,5,2),substring(IDKey,8,3)<br>结果:<br>ID &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;name &nbsp; &nbsp; &nbsp;IDup &nbsp; &nbsp; &nbsp; IDkey<br>161 朝阳区 &nbsp; &nbsp; R-4-1 &nbsp; &nbsp; R-4-1-1 &nbsp; &nbsp; <br>166 海淀区 R-4-1 R-4-1-2<br>129 北京市 &nbsp; &nbsp; R-4 &nbsp; &nbsp; &nbsp; R-4-1 &nbsp; &nbsp; <br>137 浙江省 &nbsp; &nbsp; R-4 &nbsp; &nbsp; &nbsp; R-4-11 &nbsp; &nbsp;<br>162 杭州市 R-4-11 R-4-11-1 &nbsp;<br>164 温州市 R-4-11 R-4-11-110<br>163 舟山市 R-4-11 R-4-11-125 &nbsp;<br>165 安徽省 R-4 R-4-12 &nbsp;<br>167 安庆市 R-4-12 R-4-12-1<br>168 黄山市 R-4-12 R-4-12-103<br>169 铜陵市 R-4-12 R-4-12-134<br>170 芜湖市 R-4-12 R-4-12-140<br>171 合肥市 R-4-12 R-4-12-79  <br>176 肥东县 R-4-12-79 R-4-12-79-1 <br>虽然没做出来最后结果,希望给大家起到一个抛砖引玉的作用啊!
 
select * from table where order by IDkey<br>使用IDkey排序不就搞定吗?看你的排序结果就是分省、市逐级列出,IDkey这个字段的值正是按省市逐级赋值的。
 
q2,你可以测试一下啊,不要只说啊。结果才是重要的。
 
把IDKEY中以-分隔的各段拆开转换成数值型再排序,把wdl2008的改一下就行了,忘记sql里字符型转数值型是什么函数了
 
select * from test order by substring(IDKey,5,2),substring(IDKey,8,3)
 
170 &nbsp;芜湖市 &nbsp;R-4-12 &nbsp; &nbsp; &nbsp;R-4-12-140<br>只要将“R-4-12-140”处理成“00120140”,即000x000x字符串形式就可以排序了。
 
不能用 IDkey 排序,因为每一级的长度是任意长,不是每级规定长度,也不能在表中增加字段.
 
首先,<br>129 &nbsp;北京市 &nbsp;R-4 &nbsp; &nbsp; &nbsp; &nbsp;R-4-1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0001<br>137 &nbsp;浙江省 &nbsp;R-4 &nbsp; &nbsp; &nbsp;R-4-11 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0011<br>161 &nbsp;朝阳区 &nbsp;R-4-1 &nbsp; &nbsp; &nbsp;R-4-1-1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;00010001<br>162 &nbsp;杭州市 &nbsp;R-4-11 &nbsp; &nbsp; &nbsp;R-4-11-1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;00110001<br>163 &nbsp;舟山市 &nbsp;R-4-11 &nbsp; &nbsp; &nbsp;R-4-11-125 &nbsp; &nbsp; &nbsp; &nbsp;00110125<br>164 &nbsp;温州市 &nbsp;R-4-11 &nbsp; &nbsp; &nbsp;R-4-11-110 &nbsp; &nbsp; &nbsp; &nbsp;00110110<br>165 &nbsp;安徽省 &nbsp;R-4 &nbsp; &nbsp; &nbsp;R-4-12 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0012<br>166 &nbsp;海淀区 &nbsp;R-4-1 &nbsp; &nbsp; &nbsp;R-4-1-2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;00010002<br>167 &nbsp;安庆市 &nbsp;R-4-12 &nbsp; &nbsp; &nbsp;R-4-12-1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;00120001<br>168 &nbsp;黄山市 &nbsp;R-4-12 &nbsp; &nbsp; &nbsp;R-4-12-103 &nbsp; &nbsp; &nbsp; &nbsp;00120103<br>169 &nbsp;铜陵市 &nbsp;R-4-12 &nbsp; &nbsp; &nbsp;R-4-12-134 &nbsp; &nbsp; &nbsp; &nbsp;00120134<br>170 &nbsp;芜湖市 &nbsp;R-4-12 &nbsp; &nbsp; &nbsp;R-4-12-140 &nbsp; &nbsp; &nbsp; &nbsp;00120140<br>171 &nbsp;合肥市 &nbsp;R-4-12 &nbsp; &nbsp; &nbsp;R-4-12-79 &nbsp; &nbsp; &nbsp; &nbsp; 00120079<br>176 &nbsp;肥东县 &nbsp;R-4-12-79 &nbsp; &nbsp; &nbsp;R-4-12-79-1 &nbsp; &nbsp;001200790001<br>看上表最后一列,将IDKey处理成该样字符串是可以排出你要的结果,<br>这个串不是要在表中增加字段,而是对IdKey的处理,最好写个函数来处理。<br>你提到每一级的长度是任意长,不错,这就需要你先取到所有级的最长度,即<br>如果<br>有除(R-4),第一级是最大数是120,第二级是1347,第三级是59991,那么在处理<br>Idkey是就应该处理成0000x,也就是最少五位字符,当然是每一级都要最少五位,<br>而且,只要处理有级的值,例如<br>R-4-1 &nbsp; &nbsp; &nbsp; &nbsp; 00001<br>R-4-12-79-1 &nbsp; 000120007900001<br>其次,考虑到节点移位的问题。不知道你节点移位后,IdKey是怎么处理的,是采用<br>原来的IdKey呢?还是用根据IdUp重新生成?<br>如果你是前者,那么,在将IdKey处理成排序字符串时,先要将IdUp替换掉IdKey中<br>的前IdUp长度的字符,再处理。<br>以上是本人愚见。
 

Similar threads

后退
顶部