2012-04-10 40 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