【问题标题】:Having hard time understanding SQL Query很难理解 SQL 查询
【发布时间】:2020-05-31 09:00:02
【问题描述】:

我遇到了这个查询,很难理解它的作用

SELECT DISTINCT
    EMPLOYEE.EMPLOYEE_ID,
    EMPLOYEE.LAST_NAME,
    EMPLOYEE.FIRST_NAME,
    COUNT(*)
FROM EMPLOYEE 
JOIN ENTRY ON EMPLOYEE.EMPLOYEE_ID = ENTRY.EMPLOYEE_ID
JOIN TICKET ON ENTRY.TICKET_ID = TICKET.TICKET_ID 
WHERE ENTRY.ACTIVITY_ID = 'ADVTS' AND EMPLOYEE.DEPARTMENT_ID ='SLS'
GROUP BY EMPLOYEE.EMPLOYEE_ID,  EMPLOYEE.LAST_NAME,
    EMPLOYEE.FIRST_NAME,ENTRY.ENTRY_ID
HAVING COUNT(ENTRY.ENTRY_ID) >= 
(SELECT CAST(1.25 * COUNT(ENTRY.ACTIVITY_ID)/COUNT(DISTINCT EMPLOYEE.EMPLOYEE_ID) AS float) 
FROM 
  EMPLOYEE 
JOIN 
  ENTRY ON EMPLOYEE.EMPLOYEE_ID = ENTRY.EMPLOYEE_ID
WHERE 
  ENTRY.ACTIVITY_ID = 'ADVTS' AND EMPLOYEE.DEPARTMENT_ID = 'SLS') 

据我了解,它列出了完成 ADVTS ACTIVITY 和来自 DEPARTMENT SLSEMPLOYEEs 的列表,这使得 ENTRYs 至少与 @ 中的平均条目一样多987654328@ SLS 用于ADVTS 目的

感谢任何花时间提供帮助的人

在cmets之后编辑成功结果:

SELECT 
    EMPLOYEE.EMPLOYEE_ID,
    EMPLOYEE.LAST_NAME,
    EMPLOYEE.FIRST_NAME
    FROM EMPLOYEE
JOIN 
  ENTRY ON ENTRY.EMPLOYEE_ID = EMPLOYEE.EMPLOYEE_ID
GROUP 
   BY EMPLOYEE.EMPLOYEE_ID, EMPLOYEE.LAST_NAME,
    EMPLOYEE.FIRST_NAME
HAVING 
  COUNT(ENTRY.ENTRY_ID) >= 
(SELECT 
  CAST(1.25 * 
  COUNT(ENTRY.ACTIVITY_ID)/COUNT(DISTINCT EMPLOYEE.EMPLOYEE_ID)AS float) 
FROM 
  EMPLOYEE JOIN ENTRY ON EMPLOYEE.EMPLOYEE_ID = ENTRY.EMPLOYEE_ID
WHERE 
  ENTRY.ACTIVITY_ID = 'ADVTS' AND EMPLOYEE.DEPARTMENT_ID = 'SLS') 

输出:

EMPLOYEE_ID| LAST_NAME| FIRST_NAME
7          | Salesman | Efficient

【问题讨论】:

  • 不要尝试。每当您看到一个同时包含 SELECT DISTINCT 和聚合函数的查询时,您都可以有理由相信它是胡言乱语。
  • @Strawberry 可以给出一些理由吗?
  • 我认为查询应该按照您的建议进行。除了 ENTRY.ENTRY_ID 不应该在 GROUP BY 我猜。它需要所有活动超过平均水平 25% 的员工。
  • 是的@Wouter 我刚刚意识到这一点。另外我认为没有必要加入TICKET

标签: sql sql-server sql-server-2019


【解决方案1】:

假设TICKET_IDTicket 中是唯一的,并且在ENTRY 中绝不是NULL,那么您可以去掉那个JOIN

然后我假设查询的目的是返回总平均数超过 1.25 的员工。这需要更多(合理的)假设,但这更简单地写成:

SELECT e.*
FROM (SELECT EM.EMPLOYEE_ID, EM.LAST_NAME, EM.FIRST_NAME, COUNT(*) AS CNT,   
             SUM(COUNT(*)) OVER () * 1.0 / COUNT(*) OVER () as AVG_CNT    
      FROM EMPLOYEE EM JOIN
           ENTRY EM
           ON EM.EMPLOYEE_ID = EN.EMPLOYEE_ID 
      WHERE EN.ACTIVITY_ID = 'ADVTS' AND EM.DEPARTMENT_ID = 'SLS'
      GROUP BY EM.EMPLOYEE_ID, EM.LAST_NAME, EM.FIRST_NAME
     ) e
WHERE cnt >= 1.25 * avg_cnt

【讨论】:

    猜你喜欢
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 2015-10-13
    • 2010-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多