2014-02-10 55 views
0

我的要求是根據最常用的診斷獲取診斷列表。因此,爲了達到這個目的,我在數據庫的tblDiagnosisMst表中添加了一個名爲DiagnosisCounter的Column,每次用戶選擇它時,每次診斷時都會增加1。所以,我的查詢是象下面這樣:如何僅使用SQL爲結果集中的前20條記錄排序?

select DiagnosisID,DiagnosisCode,Name from tblDiagnosisMst 
    where GroupName = 'Common' and RecStatus = 'A' order by DiagnosisCounter desc, 
    Name asc 

所以,這個查詢幫助我獲得診斷的名單,但在診斷診斷名稱降序排序,然後按字母順序排列。但是現在我的客戶只想在頂部顯示20個最常用的診斷名稱,然後所有名稱都應按字母順序顯示。但不幸的是我陷入了這一點。如果我爲這個問題找到有用的建議,我會很感激。

+0

什麼數據庫系統(如SQL服務器,Oracle,MySQL等)和版本您使用的? –

+0

對不起,我忘了提。我正在使用SQL Server 2005.謝謝。 – barsan

+0

在您的選擇語句中使用前20,如「select top 20 DiagnosisID,DiagnosisCode,Name from tblDiagnosisMst where GroupName ='Common'and RecStatus ='A'by DiagnosisCounter desc, Name asc」 –

回答

6

這應該做的伎倆:

;With Ordered as (
    select DiagnosisID,DiagnosisCode,Name, 
    ROW_NUMBER() OVER (ORDER BY DiagnosisCounter desc) as rn 
    from tblDiagnosisMst 
    where GroupName = 'Common' and RecStatus = 'A' 
) 
select * from Ordered 
order by CASE WHEN rn <= 20 THEN rn ELSE 21 END, 
    Name asc 

我們使用ROW_NUMBER到編號分配1-X到每一行的基礎上,diagnosiscounter。然後我們使用該值作爲第一個ORDER BY條件(如果它在1-20中),並且所有其他行在21的位置上排序相同。然後將第二個條件用作決勝球,將剩餘的行按name排序。

+0

優雅的解決方案! –

+0

非常感謝您讓我的一天成爲我的朋友。我很感激。它只是像魅力一樣工作。再次感謝。 +1 – barsan

0

試試這個

SELECT TOP 20 
* FROM tblDiagnosisMst ORDER BY DiagnosisCounter; 
相關問題