有趣的SQL排序问题

时间:2010-05-06 04:31:41

标签: sql stored-procedures logic

这是关键时刻,我最近的合同截止日期是两天,几乎所有事情都已完成并且工作正常(敲木头)除了一个问题。

在我的一个存储过程中,我需要按如下方式返回结果集。

group_id      name
--------      --------
A101          Craig
A102          Craig
Z101          Craig
Z102          Craig
A101          Jim
A102          Jim
Z101          Jim
Z102          Jim
B101          Andy
B102          Andy
Z101          Andy
Z102          Andy

名称需要按组ID的第一个字符排序,并且还包括Z101 / Z102条目。通过严格按组ID排序,我得到如下结果集:

group_id      name
--------      --------
A101          Craig
A102          Craig
A101          Jim
A102          Jim
B101          Andy
B102          Andy
Z101          Andy
Z102          Andy
Z101          Craig
Z102          Craig
Z101          Jim
Z102          Jim

我真的想不出一个解决方案,它不会让我制作光标并使存储过程膨胀比现有的更多。我相信一个伟大的思想有一个优雅的解决方案,我渴望看到社区可以想出什么。

提前感谢。

编辑:让我展开:)对不起,已经很晚了,我喝咖啡了。

上述结果集是特殊类型数据输入的特例。透明,我们正在建立一个基于选举的网站,这些将是按办公室,名称和区域排序的候选人。

大多数办公室都有多个区域,除了地方职位,如县长/验尸官,只有一个。 Z作为缺席机器和缺席纸票的“区”进入。

非县长职位可以先按姓名排序,因为它们都是分组在一起的。但是,现有系统将所有地方法官列入一大堆信息,当时应根据各个地区进行分类。这就是问题所在。

为了保护我的自豪感,我想补充一点,我无法控制数据库的规范化。它是由客户提供给我的。

这是我的存储过程的order子句,如果它有帮助:

    ORDER BY    candidate.party,
            candidate.ballot_name,  
CASE WHEN       candidate.district_type = 'MAG' THEN LEFT(votecount.precinct_id, 1) END,
        candidate.last_name,
        candidate.first_name,
        precinct.name

编辑2 :这是我目前所处的位置(上午1:43) -

我正在使用以下建议创建条件内连接,如下所示:

    IF          candidate.district_type = 'MAG'
BEGIN
    (
        SELECT candidate.id AS candidate_id, candidate.last_name, LEFT(votecount.precinct_id, 1) AS district, votecount.precinct_id
        FROM candidate
        INNER JOIN votecount
        ON votecount.candidate_id = candidate.id
        GROUP BY name
    ) mag_order
    INNER JOIN      mag_order
    ON              mag_order.candidate_id = candidate.id
END

然后我将按mag_order.district,candidate.precinct_id,candidate.last_name对其进行排序。

出于某种原因,我将(SELECT)别名为mag_order时出现SQL错误。有人看到代码有什么问题吗?我不能为我的生活。对不起,这有点切线。

3 个答案:

答案 0 :(得分:1)

SELECT g1.group_id, g1.name
FROM 
    groups g1
        INNER JOIN
    (
        SELECT  MIN(group_id), name
        FROM groups
        GROUP BY name
    ) g2 on g1.name = g2.name
ORDER BY g2.group_id, g1.name, g1.group_id

答案 1 :(得分:0)

ORDER BY名称DESC,SUBSTR(group_id,1),group_id

答案 2 :(得分:0)

SELECT groupId, name
FROM table
ORDER BY getFirstGroupId(name), name, groupId

然后你的getFirstGroupId()函数将返回该名称的第一个groupId

SELECT MIN(groupId)
FROM groupTable
WHERE name = @name