我有下表,其中将机械分配给车辆。我试图找出如何将所有分配相加并减去每个机制的所有重新分配。
结果应该是机械师N0055345应该有2个任务,机械师N0057581应该有0(由于重新分配)。
Auto ID EntryDate Mechanic ID Vehicle Type
1022013 8/17/2013 N0055345 CAR
1022011 8/15/2013 N0057581 CAR
1022011 8/19/2013 N0055345 CAR
谢谢, 布拉德
答案 0 :(得分:0)
所以我在这里采用的理论是,我只想按照auto_id
的“最新”记录计算机制。
SELECT mechanic
, Count(*)
FROM (
SELECT mechanic
, Row_Number() OVER (PARTITION BY auto_id ORDER BY entry_date DESC) As row_num
FROM your_table
) As x
WHERE row_num = 1
GROUP
BY mechanic
答案 1 :(得分:0)
您正在寻找的是力学的当前分配。因此,您需要为每个自动选择最新记录。如果您的数据库支持窗口函数,您可以在sum()
语句中找到最大值并进行比较:
SELECT mechanic, sum(case when entrydate = maxdate then 1 else 0 end)
FROM (SELECT mechanic, max(entrydate) OVER (PARTITION BY autoid) as maxdate
FROM t
) t
GROUP BY mechanic;
重要的是不要过滤数据,否则你将失去拥有0辆车的机制。
答案 2 :(得分:0)
结果应该是机械师N0055345应该有2个任务 和机械师N0057581应该有0(由于重新分配)。
您的数据中没有迹象表明如何达到此目的。如果这是您想要的数据集,那么您不是在寻找机械师的最新任务,而是需要所有当前任务的总和。如上所述,您的数据中没有任何内容显示重新分配的内容。
如果当前没有这样做的方法,并且您在重新分配时没有删除分配中的记录,我建议在表中添加“CurrentlyAssigned”标志,然后您可以对其进行过滤。当他们被重新分配时,切换标志。
表格数据(作业)
AutoID EntryDate MechanicID VehicleType CurrentlyAssigned
1022011 8/19/2013 N0055345 CAR 1
1022011 8/18/2013 N0057581 CAR 0
1022014 8/15/2013 N0055345 CAR 1
查询
SELECT MechanicID, COUNT(*) as [NumberOfAssignments]
FROM Assignments
WHERE CurrentlyAssigned = 1
GROUP BY MechanicID
输出
MechanicId NumberOfAssignments
N0055345 2
如果你想包括没有作业的那些,使用0/1标志的好处意味着你可以加总。
查询
SELECT MechanicID, SUM(CONVERT(INT,CurrentlyAssigned)) as [NumberOfAssignments]
FROM Assignments
GROUP BY MechanicID
输出
MechanicId NumberOfAssignments
N0055345 2
N0057581 0