关于用order by排序的问题,请大家一起看看

GGBOYS 2010-05-26 01:08:47
关于用order by排序的问题,请大家一起看看
某单位做电线成型加工,就是把电线按要求的长度切断,两端打上要求的端子(左端子和右端子),另外有可能加上些胶带或防水套管等。
其中有一种打端子的机器,可以根据作业指示,同时打左、右端子或者只打印其中一个端子。
现在需要安排作业指示:
电线顺序 左端子 右端子
---------- ---------- ----------
S1 A B
S2 A C
S3 C B
S4 W C
S5 C B
S6 B A
S7 A C
S8 D E
S9 F B
SA F C
SB C F
SC G B


实际情况会略微复杂些,如果换了端子,就需要更换机器上的模具,因为每种端子需要自己对应的模具,现在要求,怎样排序可以使模具更换的次数最少。
其中左右端子不是固定的,
例如
S9 C B
你可以看做是
S9 B C

怎么用order by实现排序
望各位高手帮忙!不清楚的地方我可以再补充!谢谢大家!

比较理想的顺序(不一定非这样,只要更换次数少就行!):
电线顺序 左端子 右端子
---- ---- ----
S1 A B
S6 B A
S2 A C
S7 A C
S5 C B
S3 C B
S4 W C
SB C F
SA F C
S9 F B
SC G B
S8 D E

也就是凡是有相同端子的线,尽量排在一起,实在有交叉的,没办法,就得分开了。
---------------------sql调试测试语句------------------
create table #t1(电线顺序 varchar(10),左端子 varchar(10),右端子 varchar(10))
insert #t1
select 'S1','A','B'
union select 'S2','A','C'
union select 'S3','C','B'
union select 'S4','W','C'
union select 'S5','C','B'
union select 'S6','B','A'
union select 'S7','A','C'
union select 'S8','D','E'
union select 'S9','F','B'
union select 'SA','F','C'
union select 'SB','C','F'
union select 'SC','G','B'

--select * from #t1 order by ??????

drop table #t1
...全文
145 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
GGBOYS 2010-05-27
  • 打赏
  • 举报
回复
和几个朋友讨论了下,一致认为sql不大适合做这样的排列,谢谢大家,如果有什么新的方式,再提出了讨论吧。结贴。
GGBOYS 2010-05-27
  • 打赏
  • 举报
回复
xys_777 谢谢,和前边几位朋友的一样,要是能把
S9 F B
SC G B
调过来,使得F端子同下边的链接起来就好了。
SB C F
SA F C

十分感谢大家。。。不瞒大家说,发帖之前这类方法我都试过了,目前也就用的上边这种方法,但是略有缺陷,希望大家再接再励。。。
加油,分不够再开新帖讨论。。。
永生天地 2010-05-27
  • 打赏
  • 举报
回复
也就这样看起来好点
if object_id('t1')is not null drop table t1
go
create table t1(电线顺序 varchar(10),左端子 varchar(10),右端子 varchar(10))
insert t1
select 'S1','A','B'
union select 'S2','A','C'
union select 'S3','C','B'
union select 'S4','W','C'
union select 'S5','C','B'
union select 'S6','B','A'
union select 'S7','A','C'
union select 'S8','D','E'
union select 'S9','F','B'
union select 'SA','F','C'
union select 'SB','C','F'
union select 'SC','G','B'



select * into #t from (
select 电线顺序,左端子,右端子 from t1
union all
select 电线顺序,右端子,左端子 from t1) v
order by 左端子,右端子


select t1.* from #t a left join t1 on a.电线顺序=t1.电线顺序
where not exists(select 1 from #t b
where b.电线顺序=a.电线顺序 and b.左端子<a.左端子)

/*
电线顺序 左端子 右端子
---------- ---------- ----------
S1 A B
S6 B A
S2 A C
S7 A C
S3 C B
S5 C B
S9 F B
SC G B
SB C F
SA F C
S4 W C
S8 D E

(所影响的行数为 12 行)

*/

drop table #t
GGBOYS 2010-05-26
  • 打赏
  • 举报
回复
谢谢大家
--------------------------------------------------------------------
chuifengde (树上的鸟儿) 谢谢!
S8 D E
这条混在B端子中间了,得多换一次模具。

--------------------------------------------------------------------
feilniu 谢谢!
结果如下,
电线顺序 左端子 右端子
---------- ---------- ----------
S1 A B
S6 A B
S2 A C
S7 A C
S3 B C
S5 B C
S9 B F
SC B G
SA C F
SB C F
S4 C W
S8 D E
感觉如果下边两条掉过来就好了。
S9 B F
SC B G
--------------------------------------------------------------------
leo_lesley 谢谢
电线顺序 左端子 右端子
-------------------- ---------- ---------- ----------
AB S1 A B
AB S6 B A
AC S7 A C
AC S2 A C
BC S3 C B
BC S5 C B
BF S9 F B
BG SC G B
CF SA F C
CF SB C F
CW S4 W C
DE S8 D E
也是,能调换就好了,F就可以连起来。
BF S9 F B
BG SC G B
--------------------------------------------------------------------------------
FlySQL 谢谢,同上边2位朋友的一样效果。
--------------------------------------------------------------------------------
xys_777 谢谢,怎么12行变成9行了?
永生天地 2010-05-26
  • 打赏
  • 举报
回复
create table t1(电线顺序 varchar(2),左端子 varchar(1),右端子 varchar(1))
insert t1
select 'S1','A','B'
union select 'S2','A','C'
union select 'S3','D','B'
union select 'S4','D','C'
union select 'S5','C','B'
union select 'S6','A','B'
union select 'S7','A','C'
union select 'S8','D','C'
union select 'S9','C','B'


select * into #t from (
select 电线顺序,左端子+'左' 左端子 ,右端子+'右' 右端子 from t1
union all
select 电线顺序,右端子+'右',左端子+'左' from t1) v
order by 左端子,右端子


select a.*,t1.* from #t a left join t1 on a.电线顺序=t1.电线顺序
where not exists(select 1 from #t b
where b.电线顺序=a.电线顺序 and b.左端子<a.左端子)

/*
电线顺序 左端子 右端子 电线顺序 左端子 右端子
---- ---- ---- ---- ---- ----
S1 A左 B右 S1 A B
S6 A左 B右 S6 A B
S7 A左 C右 S7 A C
S2 A左 C右 S2 A C
S5 B右 C左 S5 C B
S9 B右 C左 S9 C B
S3 B右 D左 S3 D B
S8 C右 D左 S8 D C
S4 C右 D左 S4 D C

(所影响的行数为 9 行)

*/

drop table #t
FlySQL 2010-05-26
  • 打赏
  • 举报
回复
create table #t1(电线顺序 varchar(10),左端子 varchar(10),右端子 varchar(10))
insert #t1
select 'S1','A','B'
union select 'S2','A','C'
union select 'S3','C','B'
union select 'S4','W','C'
union select 'S5','C','B'
union select 'S6','B','A'
union select 'S7','A','C'
union select 'S8','D','E'
union select 'S9','F','B'
union select 'SA','F','C'
union select 'SB','C','F'
union select 'SC','G','B'

select *
from #t1

select *
into #t2
from(
select 电线顺序,左端子 as 端子 from #t1
union all
select 电线顺序,右端子 from #t1
) a
order by 1,2

select a.*
from #t1 a
join(
select 电线顺序,
px=(select ''+端子 from #t2 where 电线顺序=t.电线顺序 for xml path(''))
from #t2 t
group by 电线顺序) b
on a.电线顺序=b.电线顺序
order by b.px,a.电线顺序

/**
电线顺序 左端子 右端子
---------- ---------- ----------
S1 A B
S6 B A
S2 A C
S7 A C
S3 C B
S5 C B
S9 F B
SC G B
SA F C
SB C F
S4 W C
S8 D E

(12 行受影响)

**/
leo_lesley 2010-05-26
  • 打赏
  • 举报
回复
create table #t1(电线顺序 varchar(10),左端子 varchar(10),右端子 varchar(10))
insert #t1
select 'S1','A','B'
union select 'S2','A','C'
union select 'S3','C','B'
union select 'S4','W','C'
union select 'S5','C','B'
union select 'S6','B','A'
union select 'S7','A','C'
union select 'S8','D','E'
union select 'S9','F','B'
union select 'SA','F','C'
union select 'SB','C','F'
union select 'SC','G','B'


select * from #t1 order by case when 左端子 < 右端子 then 左端子 + 右端子 else 右端子 + 左端子 end

drop table #t1

/* 结果

电线顺序 左端子 右端子
---------- ---------- ----------
S1 A B
S6 B A
S7 A C
S2 A C
S3 C B
S5 C B
S9 F B
SC G B
SA F C
SB C F
S4 W C
S8 D E

(12 row(s) affected)

*/
leo_lesley 2010-05-26
  • 打赏
  • 举报
回复
create table #t1(电线顺序 varchar(10),左端子 varchar(10),右端子 varchar(10))
insert #t1
select 'S1','A','B'
union select 'S2','A','C'
union select 'S3','C','B'
union select 'S4','W','C'
union select 'S5','C','B'
union select 'S6','B','A'
union select 'S7','A','C'
union select 'S8','D','E'
union select 'S9','F','B'
union select 'SA','F','C'
union select 'SB','C','F'
union select 'SC','G','B'


select case when 左端子 < 右端子 then 左端子 + 右端子 else 右端子 + 左端子 end,* from #t1 order by case when 左端子 < 右端子 then 左端子 + 右端子 else 右端子 + 左端子 end

drop table #t1
feilniu 2010-05-26
  • 打赏
  • 举报
回复

CREATE TABLE #tmpJob(
电线顺序 varchar(10) NOT NULL,
左端子 varchar(10) NOT NULL,
右端子 varchar(10) NOT NULL)
GO
INSERT INTO #tmpJob VALUES('S1','A','B')
INSERT INTO #tmpJob VALUES('S2','A','C')
INSERT INTO #tmpJob VALUES('S3','C','B')
INSERT INTO #tmpJob VALUES('S4','W','C')
INSERT INTO #tmpJob VALUES('S5','C','B')
INSERT INTO #tmpJob VALUES('S6','B','A')
INSERT INTO #tmpJob VALUES('S7','A','C')
INSERT INTO #tmpJob VALUES('S8','D','E')
INSERT INTO #tmpJob VALUES('S9','F','B')
INSERT INTO #tmpJob VALUES('SA','F','C')
INSERT INTO #tmpJob VALUES('SB','C','F')
INSERT INTO #tmpJob VALUES('SC','G','B')
GO
--结果
SELECT *
FROM (
SELECT 电线顺序,左端子,右端子
FROM #tmpJob
WHERE 左端子 <= 右端子
UNION ALL
SELECT 电线顺序,右端子,左端子
FROM #tmpJob
WHERE 左端子 > 右端子
) tmp
ORDER BY 左端子,右端子
chuifengde 2010-05-26
  • 打赏
  • 举报
回复
declare @a table(a VARCHAR(20),b VARCHAR(20),c VARCHAR(20))
INSERT @a select 'S1','A','B'
union select 'S2','A','C'
union select 'S3','C','B'
union select 'S4','W','C'
union select 'S5','C','B'
union select 'S6','B','A'
union select 'S7','A','C'
union select 'S8','D','E'
union select 'S9','F','B'
union select 'SA','F','C'
union select 'SB','C','F'
union select 'SC','G','B'


SELECT *
FROM @a a
ORDER BY
CASE WHEN exists(SELECT 1 FROM @a WHERE b=a.c AND c=a.b) THEN (select min(CASE WHEN c>b THEN b ELSE c END) FROM @a WHERE b=a.c AND c=a.b)+'0' ELSE
a.b+'1'END,b,c

--result
/*a b c
-------------------- -------------------- --------------------
S1 A B
S6 B A
S7 A C
S2 A C
SB C F
SA F C
S5 C B
S3 C B
S8 D E
S9 F B
SC G B
S4 W C

(所影响的行数为 12 行)
*/

22,209

社区成员

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

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