这是关键时刻,我最近的合同截止日期是两天,几乎所有事情都已完成并且工作正常(敲木头)除了一个问题。
在我的一个存储过程中,我需要按如下方式返回结果集。
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错误。有人看到代码有什么问题吗?我不能为我的生活。对不起,这有点切线。
答案 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