繁体   English   中英

按聚合计算最大值 function

[英]count max value by aggregate function

我想显示至少有一个指定驱动程序的计划数量,这样我就可以计算出至少有 1 个驱动程序的保单百分比。 例如,可能有 2 个驱动程序,所以我只想看看那些至少有一个驱动程序的人。 这是我开始的代码,我陷入了如何使计数显示为每个策略的至少 1 个驱动程序的问题。

    SELECT 
case when DRIVER_ROLE = 'Named driver' THEN 1 else null END as named_driver_ind
      ,DD.[DRIVER_ROLE]
      ,PD.[PLAN_NBR]
  FROM DD
  LEFT JOIN PD
  on PD.DRIVE_PLAN_NBR = DD.DRIVE_PLAN_NBR
group by 
DD.DRIVER_ROLE
,DD.[DRIVE_PLAN_NBR] 

这是一些示例数据。前 3 行是一个包含 3 个驱动程序的策略。 他们有 2 名司机,因此需要算作是 他们至少有 1 名司机

| DD.driver_role| DD.Drive_Plan_NBR|DP.PLAN_NBR   |DD.Driver_ID | 
|:------------: |:---------------: | :-----------:|:-----------:|
| Named driver  | 756              | 87397        | 123         |
| Policy holder | 756              | 87397        | 124         |
| Named driver  | 756              | 87397        | 125         |
| Policy holder | 759              | 23211        | 188         |

预期结果是计划数 nbr 和至少有 1 个驱动程序的最大数

| count_Plan_nbr| Policies with at least 1 more driver|| 
|:------------: |:------------------------------------:|
| 2             | 1                                    |   

欢迎来到 S/O。 您真正需要的只是针对相关疾病的 DISTINCT 计划

select distinct
      DD.DRIVE_PLAN_NBR
   from
      DD
   where
      DD.Driver_Role = 'Named driver'

直接从您的 dd 表开始,该表具有您的条件“命名驱动程序”。 由于 dd 也有计划编号,因此只需区分它,无论有多少,它都会返回 ONE。 不需要分组。

现在,如果您真的需要备用“plan_nbr”与 ID,只需加入即可。 不需要任何左侧,因为主查询将始终拉动那些具有命名驱动程序的人。 你只是得到额外的细节

select distinct
      DD.DRIVE_PLAN_NBR,
      PD.Plan_Nbr
   from
      DD
         JOIN PD
            on DD.DRIVE_PLAN_NBR = PD.DRIVE_PLAN_NBR
   where
      DD.Driver_Role = 'Named driver'

您提供的原始查询显示了我认为的所有额外部分,只是为了显示您正在测试的内容的上下文。 但是,如果您的最终目标只是哪些计划至少有一个“命名驱动程序”,那么现在您就拥有了。

来自评论的反馈

好的,越来越近了。 您需要多少不同的策略,以及不同驱动程序的实际数量。 所以是的,这将使用聚合,但完成起来仍然相对简单。 我将做一个两部分,你可以随意使用。 第一个将显示每个计划以及有多少驱动程序

select 
      DD.DRIVE_PLAN_NBR,
      PD.Plan_Nbr,
      count(distinct DD.Driver_ID) DriversOnThisPlan
   from
      DD
         JOIN PD
            on DD.DRIVE_PLAN_NBR = PD.DRIVE_PLAN_NBR
   where
      DD.Driver_Role = 'Named driver'
   group by
      DD.DRIVE_PLAN_NBR,
      PD.Plan_Nbr

这将显示(根据您的数据),显示计划编号信息的单行,但驱动程序的计数为 2。但此查询本身将显示每个计划以及每个计划有多少驱动程序。 要获得所有这些返回的单行,请通过以下方式将其包装起来

select 
      count(*) as NumberOfPlansWith1OrMoreDrivers,
      sum( PreQuery.DriversOnThisPlan ) as TotalDriversOnAllPlans
   from
      ( select
              DD.DRIVE_PLAN_NBR,
              PD.Plan_Nbr,
              count(distinct DD.Driver_ID) DriversOnThisPlan
           from
              DD
                 JOIN PD
                    on DD.DRIVE_PLAN_NBR = PD.DRIVE_PLAN_NBR
           where
              DD.Driver_Role = 'Named driver'
           group by
              DD.DRIVE_PLAN_NBR,
              PD.Plan_Nbr ) PreQuery

所以在这里,count(*) 只是基于内部有多少独特的计划,而 sum() 是所有合格计划的总驱动因素。

现在,需要注意的是,如果一个司机可能在多个计划中,他们将被计入每个独特的计划中,这可能会夸大实际的独特司机。 例如,我作为私人承包商工作。 我是一个人,但我工作的 5 家公司和你有一个政策。 所以我是每家公司的承保司机。 即使我是一个人,我也会出现在 5 份保单、5 名司机上。 只是想解释/澄清您可能会被问到的可能性,但我认为这种情况对于正常的管理问题来说是一个真正的延伸异常情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM