-2

我有下表,其中机械师分配给车辆。我试图弄清楚如何将所有任务相加并减去每个机械师的所有重新分配。

结果应该是机械师 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

谢谢,布拉德

4

3 回答 3

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
于 2013-08-20T14:17:59.557 回答
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 辆汽车的机械师。

于 2013-08-20T14:21:23.900 回答
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
于 2013-08-20T14:42:17.673 回答