2012-04-10 44 views
0

美好的一天,SQL分組的數據

我有一個SQL查詢,返回了以下數據:

EmployeeID...Employee 
555..........John Doe 
666..........Jane Doe 
777..........Bob Smith 
888..........Jane Smith 
999..........Fred Jones 
000..........Freda Jones 

,我想我的查詢組由三個項目:

Item.........EmployeeId........Employee 
1............555...............John Doe 
1............666...............Jane Doe 
1............777...............Bob Smith 
2............888...............Jane Smith 
2............999...............Fred Jones 
2............000...............Freda Jones 

換句話說,對於每條記錄超過3條的記錄,我希望每三條記錄增加一條。

我相信我可以使用某種行插入到表中並跟蹤插入到表中的行數。但我試圖看看我是否可以在SQL本身中解決這個問題。

這可能嗎?

TIA,

COSON

+3

你正在使用哪些DBMS?根據你是否使用SQL Server,Oracle,MySQL等,可能會有不同的解決方案...... – joshuahealy 2012-04-10 06:08:32

+0

group by employeeId andemployee and divide count by 3? – Goran 2012-04-10 06:14:48

+1

您還需要一些在您的問題中缺少的訂購標準 – 2012-04-10 06:21:41

回答

1

如果你的數據庫的SQL各種支持排序功能,你可以嘗試這樣的事:

SELECT 
    FLOOR((ROW_NUMBER() OVER (ORDER BY EmployeeID) + 2)/3) AS Item, 
    EmployeeID, 
    Employee 
FROM Employees 
ORDER BY EmployeeID 

一些數據庫系統自動執行整數分頻時,兩個操作數是整數,其他人支持專門的操作(如DIV)的整體劃分而不是/。當然,在上述兩種情況下,FLOOR()都是不必要的。

+0

(Very)minor nitpick:這些函數的官方(ANSI標準)名稱是「窗口函數」(不是排名函數) – 2012-04-10 14:00:21

+0

非常好,謝謝你的通知,我其實並不知道。我認爲*窗口函數*是一個更廣泛的術語,不過,其中包括*窗口聚合函數*。也許有一個特定的官方術語代表*排名功能*?你知道,像'ROW_NUMBER()','RANK()'等 – 2012-04-10 14:04:05

+0

好點;)標準說:「*窗口函數是:...秩函數,分佈函數,行號函數,窗口集合函數... *「 – 2012-04-10 14:12:02

1

那麼,這應該在大多數DBMS的工作:

select floor((count(*) + 2)/3) item, t1.employeeId, t1.employee 
from t t1 
join t t2 on t1.employeeId >= t2.employeeId 
group by t1.employeeId, t1.employee 
order by t1.employeeId 

您可以用小提琴演奏here