2010-05-06 40 views
3

這是關鍵時刻,我最近的合同的截止日期是兩天內到來,除了一個問題,幾乎所有事情都完成並且工作正常(敲木頭)。有趣的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錯誤。任何人都看到代碼有問題嗎?我無法爲我的生活。對不起,這有點切題。

+0

您好,我不明白要求。如果要按group_id的第一個字符排序,輸出是否不正確? 「Z101」和「克雷格」的組合來自哪裏,或者......第二張桌子在哪裏?你可以請張貼一些樣本完整的輸入,你想要的輸出,以及你實際得到的輸出,因爲我懷疑你只是發佈部分數據並將其切斷。 – 2010-05-06 04:40:41

+0

我會採取一些措施來改寫你的標準,請發表評論(或更新你的問題):你想按group_id的第一個字符排序,這意味着A在B之前到達C之前等。那麼對於A而言,你想按名稱排序,這意味着Andy會在Craig之前出現(除了Andy沒有任何A)。但是,一旦你確定你到了克雷格,你也需要他所有的Z。 – 2010-05-06 04:43:07

+1

我認爲'ORDER BY name,group_id'是你所需要的,但這取決於Craig/etc分組的頂部是否更重要。 – 2010-05-06 04:45:32

回答

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 
+0

這個解決方案非常接近。唯一的問題是,我上面討論的是大量返回數據中的特例。大約20%的返回數據需要按照我的要求處理,其他80%是簡單的[按名稱排序,group_id]。 我打算玩一下你的解決方案,並嘗試使其適合。萬分感謝。 – 2010-05-06 05:07:48

+0

@fly,你的排序集有Craig,Jim,Andy。我不知道這是如何與「name,group_id」的80%分享。可能需要更大的數據集樣本和預期結果(以及測試數據ddl/inserts)。 – 2010-05-06 05:44:00

0

ORDER BY名DESC,SUBSTR(GROUP_ID,1),GROUP_ID

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

然後你getFirstGroupId()函數會返回前的groupId該名稱

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