3

我有一个表格,其中包含如下所示的部分数据。我已经在 edition_id 上完成了订购。现在还需要订购 laungauge_id,这取决于 edition_id 的值。

  • Edition_id 是指出版报纸的城市。
  • Language_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>
4

4 回答 4

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,那么我会将其限制在一个函数中,以便您可以在其他地方重新使用该逻辑。

于 2012-12-23T10:19:44.003 回答
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
于 2012-12-23T10:24:43.447 回答
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 
于 2012-12-23T10:33:20.993 回答
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
于 2012-12-23T18:35:36.723 回答