我有一张表格,其中包含部分数据,如下所示。我已经在edition_id上完成了订单。 现在还需要订购laungauge_id,这取决于edition_id的值。
所以假设edition_id = 5
它意味着新德里
新德里language_id
是13(英语),5(印地语),1(泰卢固语),4(乌尔都语)。
我想要的是显示新德里,首先显示所有英文文章,然后是印地文,其次是泰卢固语,然后是乌尔都语。
如果edition_id = 1,那么language_id的顺序应为 13,1,2。
同样,
如果edition_id = 5,那么language_id的顺序应为 13,5,1,4
现在我拥有的是
Edition_id | Language_id
1 1
1 2
1 13
1 1
1 13
1 2
5 4
5 1
5 1
5 4
5 13
5 5
5 13
需要什么
Edition_id | Language_id
1 13
1 13
1 1
1 1
1 2
1 2
5 13
5 13
5 5
5 1
5 1
5 4
5 4
怎么做?请帮忙。
是这样的可能吗
Select * from <table>
order by edition_id ,
case when edition=6 then <order specified for language_id ie 13,5,1,4>
答案 0 :(得分:5)
我会创建一个补充排名表。然后我会加入以提供您的排序顺序。例如:
EDITION_SORT_ORDER
EDITION_ID LANGUAGE_ID RANK
---------- ----------- ----
1 13 1
1 1 2
1 2 3
5 13 1
5 5 2
5 1 3
5 4 4
在查询中使用此表可能如下所示:
SELECT E.EDITION_ID, E.LANGUAGE_ID
FROM <TABLE> E LEFT OUTER JOIN EDITION_SORT_ORDER S ON
E.EDITION_ID = S.EDITION_ID AND
E.LANGUAGE_ID = S.LANGUAGE_ID
ORDER BY S.RANK
通过这种方式,您可以在将来添加其他规则,并不是CASE逻辑的一大堆。
或者,如果你想避免JOIN,你可以创建一个存储函数,它执行类似的查找并返回一个排名(基于传递的EDITION_ID和LANGUAGE_ID参数)。
如果你必须使用CASE,那么我将它限制在一个函数中,这样你就可以在其他地方重用逻辑。
答案 1 :(得分:2)
如果背后没有数学逻辑,我会插入另一个可用于正确排序的列 如果你不能这样做,你可以简单地输入关系规则:
Order By Edition_Id,
case Edition_id
when 1 then
case Language_id
when 13 then 1
when 1 then 2
when 2 then 3
end
when 5 then
case Language_id
when 13 then 1
when 5 then 2
when 1 then 3
when 4 then 4
end
end
答案 2 :(得分:1)
没有固定的顺序列,你可以这样,但逻辑是不可理解的
假设第一个标准是Language_id的长度,
第二个是Edition_id = Language_id,
休息是Language_id的顺序,它可以或以这种方式工作:
Declare @t table(Edition_id int, Language_id int)
insert into @t values
(1, 1),
(1, 2),
(1, 13),
(1, 1),
(1, 13),
(1, 2),
(5, 4),
(5, 1),
(5, 1),
(5, 4),
(5, 13),
(5, 5),
(5, 13);
Select * from @t
order by Edition_id,Case when len (Cast(Language_ID as Varchar(10)))=1 then '1' else '0' end
+case when Edition_id=Language_id then '0' else '1' end
,Language_ID
答案 3 :(得分:1)
您可能已经考虑过这一点,但如果您所需的排序始终基于该语言的实际字母名称,那么通常会有一个表格,其中包含您可以加入的语言描述,然后排序。我的建议基于下面的报价。
......首先是英文文章,其次是印地文,其次是泰卢固语 其次是乌尔都语。
SELECT E.EDITION_ID, E.LANGUAGE_ID, LN.LANGUAGE_NAME
FROM <TABLE> E LEFT OUTER JOIN <LANGUAGE_NAMES> LN ON
E.LANGUAGE_ID = LN.LANGUAGE_ID
ORDER BY 1, 3