很难理解 SQL 查询
Having hard time understanding SQL Query
我 运行 遍历了这个查询,但很难理解它的作用
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')
据我所知,它给出了 EMPLOYEE
的列表,他们完成了 ADVTS
ACTIVITY
和来自 DEPARTMENT
SLS
的 [=19] =]s 至少与 DEPARTMENT
SLS
中出于 ADVTS
目的
的平均条目一样多
感谢所有花时间提供帮助的人
评论后编辑成功结果:
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
假设 TICKET_ID
在 Ticket
中是唯一的并且在 ENTRY
中永远不会是 NULL
,那么你可以去掉那个 JOIN
。
然后我假设查询的目的是 return 员工人数超过总体平均值的 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
我 运行 遍历了这个查询,但很难理解它的作用
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')
据我所知,它给出了 EMPLOYEE
的列表,他们完成了 ADVTS
ACTIVITY
和来自 DEPARTMENT
SLS
的 [=19] =]s 至少与 DEPARTMENT
SLS
中出于 ADVTS
目的
感谢所有花时间提供帮助的人
评论后编辑成功结果:
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
假设 TICKET_ID
在 Ticket
中是唯一的并且在 ENTRY
中永远不会是 NULL
,那么你可以去掉那个 JOIN
。
然后我假设查询的目的是 return 员工人数超过总体平均值的 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