Настало время кризиса, последний контракт для моего последнего контракта наступает через два дня, и почти все готово и работает нормально (стук по дереву), за исключением одного выпуска.
В одной из моих хранимых процедур мне нужно вернуть набор результатов следующим образом.
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
Имена должны быть отсортированы по первому символу идентификатора группы, а также включать записи Z101 / Z102. Сортируя строго по идентификатору группы, я получаю следующий набор результатов:
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 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, кандидат.precinct_id, Кандидат.Last_name.
По какой-то причине я получаю ошибку SQL при совмещении (SELECT) как mag_order. Кто-нибудь видит что-то не так с кодом? Я не могу ради своей жизни. Извините, это немного тангенциально.