代码之家  ›  专栏  ›  技术社区  ›  Matt

基于单个列汇总多个值

sql
  •  0
  • Matt  · 技术社区  · 6 年前

    从上下文来看,我在运输业工作。另外,我为一个糟糕的标题道歉-我不知道如何总结我的问题。

    我目前正在编辑一份现有的报告,该报告返回司机ID、他们的姓名、他们被雇用的时间,以及他们自进入公司以来行驶的总里程数。我注意到,在公司内流动的驾驶员会被分配一个不同的驾驶员ID,这不计入他们的总行驶里程。通过向我提供的一个示例,我确实能够确认这个场景,如下所示:

    DriverCode   DriverName
    -----------  ----------------
    WETDE        Wethington,Dean
    WETDEA       Wethington,Dean
    

    这是获取上述内容的查询(示例驱动程序现在是硬编码的):

    select mpp.mpp_id as DriverCode,
           mpp.mpp_lastfirst as DriverName
    from manpowerprofile mpp
        outer apply (select top 1 mpp_id
                     from manpowerprofile) as id
    where mpp_firstname = 'Dean'
        and mpp_lastname = 'Wethington'
    

    这是当前的查询:

    SELECT lh.lgh_driver1 as DriverCode
                  ,m.mpp_lastfirst as DriverName
                  ,m.mpp_hiredate as HireDate
                  ,SUM(s.stp_lgh_mileage) as TotMiles
    FROM stops s (nolock)
                 INNER JOIN legheader lh (nolock) on lh.lgh_number = s.lgh_number
                 INNER JOIN manpowerprofile m (nolock) on m.mpp_id = lh.lgh_driver1
    
                /* OUTER APPLY ( SELECT top 1 mpp_id
                               FROM manpowerprofile) as id */
    
    WHERE m.mpp_terminationdt > GETDATE()
                  AND m.mpp_id <> 'UNKNOWN'
                  AND lh.lgh_outstatus = 'CMP'
    GROUP BY lh.lgh_driver1, m.mpp_lastfirst, m.mpp_hiredate
        HAVING SUM(s.stp_lgh_mileage) > 850000
    ORDER BY DriverCode DESC
    

    我要做的是检查一个名字是否存在两次,如果存在两次,将两个驾驶员代码的总英里数加在一起,返回单个驾驶员的一个结果。我还是一个非常新手的SQL开发人员,现在才真正开始深入研究数据库。

    我目前的思路是使用外部应用程序,但我相信有更好的方法来实现这一点。

    1 回复  |  直到 6 年前
        1
  •  1
  •   MatBailie    6 年前

    根据你的意见,留下司机代码和雇用日期… (因为它们可能/将不同于被合并的驾驶员。)

    SELECT 
        m.mpp_lastfirst as DriverName
       ,SUM(s.stp_lgh_mileage) as TotMiles
    FROM
        stops s (nolock)
    INNER JOIN
        legheader lh (nolock)
            on lh.lgh_number = s.lgh_number
    INNER JOIN
        manpowerprofile m (nolock)
            on m.mpp_id = lh.lgh_driver1
    WHERE
            m.mpp_terminationdt > GETDATE()
        AND m.mpp_id <> 'UNKNOWN'
        AND lh.lgh_outstatus = 'CMP'
    GROUP BY
        m.mpp_lastfirst
    HAVING
        SUM(s.stp_lgh_mileage) > 850000
    ORDER BY
        m.mpp_lastfirstDESC