子查询计算

时间:2014-01-03 21:27:49

标签: sql subquery

如何让我的子查询计算每个员工的按时率,对它们进行分组,然后按描述顺序对它们进行排序?

SELECT 
    EMPLOYEE_NAME AS EMPLOYEE, 
    (
        SELECT 
        (
            SELECT 
                CAST(COUNT(APE_BUSDRIVER_STATUS_OBJID) AS DECIMAL) 
            FROM dbo.APE_BUSDRIVER_MAIN 
            WHERE APE_AREA_OBJID = 3 
                  AND YEAR_TIME = '2014' 
                  AND ACTIVE = 1 
                  AND APE_BUSDRIVER_STATUS_OBJID = 1
        )
        /
        ( 
            SELECT 
                CAST(COUNT(APE_BUSDRIVER_STATUS_OBJID) AS DECIMAL) 
            FROM dbo.APE_BUSDRIVER_MAIN 
            WHERE APE_AREA_OBJID = 3 
                  AND YEAR_TIME = '2014' 
                  AND     ACTIVE     = 1
        )
    ) AS YIELD
FROM dbo.APE_BUSDRIVER_MAIN 
WHERE YEAR_TIME = '2014' 
      AND APE_AREA_OBJID = 3 
      AND ACTIVE = 1 
GROUP BY EMPLOYEE_NAME 
ORDER BY YIELD DESC

结果:
enter image description here

如您所见,子查询为每位员工提供相同的结果。

这是表FYI: enter image description here

续...

enter image description here

注意:
APE_BUSDRIVER_STATUS_OBJID:
1 =开启时间
2 =晚于

2 个答案:

答案 0 :(得分:1)

SELECT 
    EMPLOYEE_NAME AS EMPLOYEE,
    CAST(COUNT(CASE WHEN APE_BUSDRIVER_STATUS_OBJID = 1 THEN APE_BUSDRIVER_STATUS_OBJID END) AS DECIMAL) /
        CAST(COUNT(APE_BUSDRIVER_STATUS_OBJID) AS DECIMAL) AS YIELD
FROM
    dbo.APE_BUSDRIVER_MAIN 
WHERE
    YEAR_TIME = '2014' AND
    APE_AREA_OBJID = 3 AND
    ACTIVE = 1 
GROUP BY
    EMPLOYEE_NAME 
ORDER BY
    YIELD DESC

答案 1 :(得分:0)

您根本不想使用子查询;子查询绕过where子句,并为每个员工提供相同的结果。我认为这很接近你想要的东西:

SELECT 
  EMPLOYEE_NAME,
  CAST(COUNT(APE_BUSDRIVER_STATUS_OBJID) AS DECIMAL) 
  /
  CAST(COUNT(APE_BUSDRIVER_STATUS_OBJID) AS DECIMAL) 
  AS YIELD,
FROM 
  dbo.APE_BUSDRIVER_MAIN 
  WHERE 
    YEAR_TIME = '2014' 
    AND APE_AREA_OBJID = 3 
    AND ACTIVE = 1 
  GROUP BY EMPLOYEE_NAME 
  ORDER BY YIELD 
    DESC