一列的平均值基于不同的值和其他列的分组

时间:2014-04-29 23:47:56

标签: mysql sql

这是我正在使用的SQL。但平均值不是对不同的工作数进行平均,而是全部使用它们。

我想获得客户的平均工作时间和独特工作总数。平均时间必须仅基于唯一的工作号。

SELECT CUSTOMER, COUNT(DISTINCT JOB_NO) AS JOB_COUNT, AVG(WORK_TIME) AS WT 
FROM CYCLE_TIME 
GROUP BY CUSTOMER 

非常感谢任何帮助。

Charles,我使用了您的第一个查询,并与一位客户进行了测试。我通过以下WT值为客户提供5个工作。 28.95, 24.72, 2.56, 15.14, 8.94。这是16.06的平均值。

如果我使用以下查询并且仅按客户分组,则平均值(WT)最终为22.39。我不确定那里发生了什么。

 SELECT CUSTOMER, JOB_NO, AVG(WORK_TIME) AS WT 
 FROM CYCLE_TIME 
 WHERE CUSTOMER='customer_a'
 GROUP BY CUSTOMER

2 个答案:

答案 0 :(得分:1)

根据AVG使用您自己的SUM()/COUNT(DISTINCT)计算:

SELECT
    CUSTOMER,
    COUNT(DISTINCT JOB_NO) AS JOB_COUNT,
    SUM(WORK_TIME)/COUNT(DISTINCT JOB_NO) AS WT 
FROM CYCLE_TIME 
GROUP BY CUSTOMER 

答案 1 :(得分:0)

您需要在分组中包含职位编号。

SELECT CUSTOMER, JOB_NO, AVG(WORK_TIME) AS WT 
FROM CYCLE_TIME 
GROUP BY JOB_NO, CUSTOMER

如果您还想知道每个客户有多少job_nos,那么这需要在一个单独的子查询中

SELECT ct.CUSTOMER, 
   (Select Count (Distinct JOB_NO) 
    From CYCLE_TIME  
    where CUSTOMER = ct.Customer) JOB_COUNT,
   JOB_NO, AVG(WORK_TIME) AS WT 
FROM CYCLE_TIME ct
GROUP BY JOB_NO, ct.CUSTOMER

请记住,平均值不一定是整体平均值。一个工作可能有比另一个更多的记录。

运行此查询,您将看到差异:

 SELECT ct.CUSTOMER, Count(*) numRecords,
   (Select Count (Distinct JOB_NO) 
    From CYCLE_TIME  
    where CUSTOMER = ct.Customer) JOB_COUNT,
   JOB_NO, AVG(WORK_TIME) AS WT 
FROM CYCLE_TIME ct
GROUP BY JOB_NO, ct.CUSTOMER

如果您的整体平均值是22.39,那么就业率平均值高的就业人数可能会比平均工作人数低的就业人数多