【问题标题】:Sub query calculation子查询计算
【发布时间】:2014-01-03 21:27:48
【问题描述】:

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

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

结果:

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

这是表格仅供参考:

继续...

注意:
APE_BUSDRIVER_STATUS_OBJID:
1 = 准时
2 = 迟到

【问题讨论】:

  • 子查询没有引用 EMPLOYEE 表中的任何 ID...这就是问题所在。
  • 为什么人们不更多地使用 JOIN?
  • @Nicarus 我如何使用连接??
  • 很多时候像这样使用子查询,直接对表使用JOIN或者子查询会好很多,这样可以更好的设置表/集之间的关系。在你的情况下,它实际上看起来你甚至不需要子查询。

标签: sql subquery


【解决方案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

【讨论】:

  • 我收到此错误:“消息 102,级别 15,状态 1,行 3 ')' 附近的语法不正确。”
【解决方案2】:

您根本不想使用子查询;子查询绕过 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

【讨论】:

  • 你总是会得到 1 作为结果。
猜你喜欢
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多