這是關鍵時刻,我最近的合同的截止日期是兩天內到來,除了一個問題,幾乎所有事情都完成並且工作正常(敲木頭)。有趣的SQL排序問題
在我的一個存儲過程中,我需要返回結果集如下。
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 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,CAND對其進行排序idate.last_name。
出於某種原因,我在獲取(SELECT)爲mag_order時出現SQL錯誤。任何人都看到代碼有問題嗎?我無法爲我的生活。對不起,這有點切題。
您好,我不明白要求。如果要按group_id的第一個字符排序,輸出是否不正確? 「Z101」和「克雷格」的組合來自哪裏,或者......第二張桌子在哪裏?你可以請張貼一些樣本完整的輸入,你想要的輸出,以及你實際得到的輸出,因爲我懷疑你只是發佈部分數據並將其切斷。 – 2010-05-06 04:40:41
我會採取一些措施來改寫你的標準,請發表評論(或更新你的問題):你想按group_id的第一個字符排序,這意味着A在B之前到達C之前等。那麼對於A而言,你想按名稱排序,這意味着Andy會在Craig之前出現(除了Andy沒有任何A)。但是,一旦你確定你到了克雷格,你也需要他所有的Z。 – 2010-05-06 04:43:07
我認爲'ORDER BY name,group_id'是你所需要的,但這取決於Craig/etc分組的頂部是否更重要。 – 2010-05-06 04:45:32