【发布时间】:2018-02-20 04:44:31
【问题描述】:
这篇文章是我之前的帖子here的增强版。
请注意:这不是重复的帖子或线程。
我有 3 张桌子:
1. REQUIRED_AUDITS (Independent table)
2. SCORE_ENTRY (SCORE_ENTRY is One to Many relationship with ERROR table)
3. ERROR
以下是虚拟数据和表结构:
REQUIRED_AUDITS TABLE
+-------+------+----------+---------------+-----------------+------------+----------------+---------+
| ID | VP | Director | Manager | Employee | Req_audits | Audit_eligible | Quarter |
+-------+------+----------+---------------+-----------------+------------+----------------+---------+
| 10001 | John | King | susan@com.com | jake@com.com | 2 | Y | FY18Q1 |
| 10002 | John | King | susan@com.com | beth@com.com | 4 | Y | FY18Q1 |
| 10003 | John | Maria | tony@com.com | david@com.com | 6 | N | FY18Q1 |
| 10004 | John | Maria | adam@com.com | william@com.com | 3 | Y | FY18Q1 |
| 10005 | John | Smith | alex@com.com | rose@com.com | 6 | Y | FY18Q1 |
+-------+------+----------+---------------+-----------------+------------+----------------+---------+
SCORE_ENTRY TABLE
+----------------+------+----------+---------------+-----------------+-------+---------+
| SCORE_ENTRY_ID | VP | Director | Manager | Employee | Score | Quarter |
+----------------+------+----------+---------------+-----------------+-------+---------+
| 1 | John | King | susan@com.com | jake@com.com | 100 | FY18Q1 |
| 2 | John | King | susan@com.com | jake@com.com | 90 | FY18Q1 |
| 3 | John | King | susan@com.com | beth@com.com | 98.45 | FY18Q1 |
| 4 | John | King | susan@com.com | beth@com.com | 95 | FY18Q1 |
| 5 | John | King | susan@com.com | beth@com.com | 100 | FY18Q1 |
| 6 | John | King | susan@com.com | beth@com.com | 100 | FY18Q1 |
| 7 | John | Maria | adam@com.com | william@com.com | 99 | FY18Q1 |
| 8 | John | Maria | adam@com.com | william@com.com | 98.1 | FY18Q1 |
| 9 | John | Smith | alex@com.com | rose@com.com | 96 | FY18Q1 |
| 10 | John | Smith | alex@com.com | rose@com.com | 100 | FY18Q1 |
+----------------+------+----------+---------------+-----------------+-------+---------+
错误表
+----------+-----------------------------+----------------+
| ERROR_ID | ERROR | SCORE_ENTRY_ID |
+----------+-----------------------------+----------------+
| 10 | Words Missing | 2 |
| 11 | Incorrect document attached | 2 |
| 12 | No results | 3 |
| 13 | Value incorrect | 4 |
| 14 | Words Missing | 4 |
| 15 | No files attached | 4 |
| 16 | Document read error | 7 |
| 17 | Garbage text | 8 |
| 18 | No results | 8 |
| 19 | Value incorrect | 9 |
| 20 | No files attached | 9 |
+----------+-----------------------------+----------------+
我的查询给出以下输出:
+----------+---------------+------------------+------------------+------------------+
| | | Director Summary | | |
+----------+---------------+------------------+------------------+------------------+
| Director | Manager | Audits Required | Audits Performed | Percent Complete |
| King | susan@com.com | 6 | 6 | 100% |
| Maria | adam@com.com | 3 | 2 | 67% |
| Smith | alex@com.com | 6 | 2 | 33% |
+----------+---------------+------------------+------------------+------------------+
现在我想添加一列,我希望有错误的分数除以总分数:
这不是错误总数除以得分数。相反,它对每次出现的错误计数并除以分数计数。
请查看以下示例:
考虑
导演:King
经理:susan@com.com
来自 SCORE_ENTRY TABLE 和 ERROR 表,
- King 在 SCORE_ENTRY TABLE 中有 6 个条目
- 错误表中有 6 个条目
我希望出现错误而不是 ERROR TABLE 中的 6 个条目,即 3 个错误。
计算质量的公式:
质量 = 1 -(错误发生的总和/总分)*100
对于国王: 质量 = 1 - (3/6)*100 质量 = 50
请注意:不是 1 - (6/6)*100
对于玛丽亚: 质量 = 1 - (2/2)*100 质量 = 0
下面是我需要的新输出,其中包含名为 Quality 的新列:
+----------+---------------+---------+------------------+------------------+------------------+
| | | | Director Summary | | |
+----------+---------------+---------+------------------+------------------+------------------+
| Director | Manager | Quality | Audits Required | Audits Performed | Percent Complete |
| King | susan@com.com | 50% | 6 | 6 | 100% |
| Maria | adam@com.com | 0% | 3 | 2 | 67% |
| Smith | alex@com.com | 50% | 6 | 2 | 33% |
+----------+---------------+---------+------------------+------------------+------------------+
下面是查询(感谢@Kaushik Nayak、@APC 和其他人)并且需要向该查询添加新列:
WITH aud(manager_email, director, quarter, total_audits_required)
AS (SELECT manager_email,
director,
quarter,
SUM (CASE
WHEN audit_eligible = 'Y' THEN required_audits
END)
FROM required_audits
GROUP BY manager_email,
director,
quarter), --Total_audits
scores(manager_email, director, quarter, audits_completed)
AS (SELECT manager_email,
director,
quarter,
Count (score)
FROM oq_score_entry s
GROUP BY manager_email,
director,
quarter) --Audits_Performed
SELECT a.director,
a.manager_email manager,
a.total_audits_required,
s.audits_completed,
Round(( ( s.audits_completed ) / ( a.total_audits_required ) * 100 ), 2)
percentage_complete,
a.quarter
FROM aud a
left outer join scores s
ON a.manager_email = s.manager_email
WHERE ( :P4_MANAGER_EMAIL = a.manager_email
OR :P4_MANAGER_EMAIL IS NULL )
AND ( :P4_DIRECTOR = a.director
OR :P4_DIRECTOR IS NULL )
AND ( :P4_QUARTER = a.quarter
OR :P4_QUARTER IS NULL )
ORDER BY a.total_audits_required DESC nulls last
如果它令人困惑或需要更多详细信息,请告诉我。我愿意接受任何建议和反馈。
感谢任何帮助。
谢谢,
里查
【问题讨论】:
-
你的问题很长,很多人会觉得很难理解。
-
感谢@TimBiegeleisen。我确实解释了更多细节,因为这是我从之前的帖子中收到的反馈。简单来说,我只需要从上面的 3 个表中生成最终输出表。
-
作为起点,您是否尝试过任何类似的方法;。在 SCORE_ENTRY_ID = entry_id 上的左外连接(select count(*), SCORE_ENTRY_ID from error_table group by SCORE_ENTRY_ID)
-
嗨@LJ01 我确实尝试过单独或独立的查询,但我无法做到,因为它让我很困惑。我得到的输出为 1,但是当我对输出求和时,它给出了类似嵌套过多的错误。我不记得确切的错误。需要帮助找出适合 WITH 子句的查询,因为原始 WITH 子句工作正常。我也不知道如何在 WITH 子句中附加新查询。谢谢