【问题标题】:SQL Server: Count distinct dates in a groupSQL Server:计算组中的不同日期
【发布时间】:2016-06-23 06:00:49
【问题描述】:

我还是 SQL 新手,所以我可能做错了,但是...

我需要对约会日期进行明确计数。所以 cust.id 1 的 John 应该有 3 个约会日期,而 Sara 应该有 cust.id 1 的 2 个约会日期。

临时表 (EC):

 |cust.id | emp_name | emp_id |   APPT_DATE    | Procedure_Code | something1|
 |:------:|:--------:|:------:|:--------------:|:--------------:|:---------:|
 |    1   |   john   |  100   |  2/2 00:00:00  |      a0        |    w/e    |
 |    1   |   john   |  100   |  2/3 00:00:00  |      b1        |    w/e    |
 |    1   |   john   |  100   |  2/4 00:00:00  |      c2        |    w/e    |
 |    1   |   Sara   |  200   |  2/2 00:00:00  |      d3        |    w/e    |
 |    1   |   Sara   |  200   |  2/3 00:00:00  |      e4        |    w/e    |

我正在寻找的答案:

 | cust.id | emp_name | emp_id | CNT |   APPT_DATE   | Procedure_Code |
 |:-------:|:--------:|:------:|:---:|:-------------:|:--------------:|
 |    1    |   john   |   100  |  3  |  2/2 00:00:00 |     a0101      |
 |    1    |   john   |   100  |  3  |  2/3 00:00:00 |     b1234      |
 |    1    |   john   |   100  |  3  |  2/4 00:00:00 |     c0101      |
 |    1    |   Sara   |   200  |  2  |  2/2 00:00:00 |     d0101      |
 |    1    |   Sara   |   200  |  2  |  2/3 00:00:00 |     e1234      |

我的代码:

SELECT cust_id
       ,emp_name
       ,emp_id
       ,COUNT(DISTINCT APPT_DATE)
           OVER (PARTITION BY cust_id, APPT_DATE) AS CNT
       ,APPT_DATE
       ,Procedure_Code 
FROM #EC 
ORDER BY cust_id

【问题讨论】:

  • 但是为什么你的 Procedure_Code 被改变了?
  • 您希望按客户 ID 或员工 ID 明确计算应用日期?您的描述是“cust id”,但您的结果看起来像是“emp id”。编辑:看起来都像!正确吗?
  • @Loser 客户进来完成不同的事情。例如,如果你有一天去汽车修理店买新的刹车片,然后换油。希望这是有道理的
  • @Squirrel 是的,两者都是!抱歉没有具体说明

标签: sql-server greatest-n-per-group


【解决方案1】:

我从 cmets 中看到,cust_idemp_id..

SELECT cust_id
       ,emp_name
       ,emp_id
       ,oat1.Count_Appt_Date
       ,APPT_DATE
       ,Procedure_Code 
FROM #EC
OUTER APPLY (SELECT ec2.cust_id
                  , ec2.emp_id
                  , COUNT(DISTINCT(CONVERT(date, ec2.[APPT_DATE]))) AS Count_Appt_Date
             FROM #EC ec2
             WHERE ec2.cust_id = #EC.cust_id
               AND ec2.emp_id = #EC.emp_id
             GROUP BY ec2.cust_id, ec2.emp_id) oat1
ORDER BY cust_id

【讨论】:

    【解决方案2】:

    下面的内容可能会有所帮助:

    select ec.cust_id, ec.emp_name, ec.emp_id, t.cnt, ec.APPT_DATE, ec.Procedure_Code
    from #EC ec
    join
    (
        SELECT cust_id, emp_id ,COUNT(distinct APPT_DATE) CNT
        FROM #EC
        group BY cust_id, emp_id
    ) t
    on ec.cust_id = t.cust_id and ec.emp_id = t.emp_id
    

    【讨论】:

      【解决方案3】:

      从 PARTITION BY 中删除 APPT_DATE

      COUNT(DISTINCT APPT_DATE)
                 OVER (PARTITION BY cust_id) AS CNT
      

      编辑 1:更改为 CROSS APPLY(不允许使用 OVER() 进行 DISTINCT)

      FROM #EC e
      CROSS APPLY
      (
          SELECT COUNT(DISTINCT APPT_DATE) as CNT
          FROM   #EC x
          WHERE  x.cust_id = e.cust_id
          AND    x.emp_id  = e.emp_id
      ) c
      

      【讨论】:

      • Use of DISTINCT is not allowed with the OVER clause.
      • 哦。 .忘记了
      【解决方案4】:
      select a.*,b.CNT 
      from(
          SELECT cust_id
                 ,emp_name
                 ,
                 ,APPT_DATE
                 ,Procedure_Code 
          FROM #EC
           ) as a inner join (select count(distinct appt_date)as cnt, emp_id from #EC group by emp_id)as b
        on a.emp_id = b.emp_id
      

      我觉得上面的代码可以帮到你。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-15
        • 1970-01-01
        相关资源
        最近更新 更多