当前位置: 首页 > 面试题库 >

Oracle SQL-查询以从多个表中计算值

上官和韵
2023-03-14
问题内容

我试图通过连接多个表从sql查询中获得所需的结果。由于知识有限,因此寻求大家的帮助。

我正在尝试获取每个经理和员工的审核详细信息。我有3张桌子:

1. HR
2. REQUIRED_AUDITS
3. SCORE_ENTRY

以下是 HR 表的示例数据:

+----+---------------+------------------+
| id | manager_email |        VP        |
+----+---------------+------------------+
|  1 | john@com.com  | jake@com.com     |
|  2 | smith@com.com | kathleen@com.com |
|  3 | maria@com.com | james@com.com    |
|  4 | linda@com.com | david@com.com    |
|  5 | jess@com.com  | kim@com.com      |
+----+---------------+------------------+

以下是 REQUIRED_AUDITS 表的示例数据:

+----+---------------+----------------+-----------------+----------------+
| ID | manager_email | employee_email | audits_required | audit_eligible |
+----+---------------+----------------+-----------------+----------------+
|  1 | john@com.com  | brad@com.com   |               5 | Y              |
|  2 | linda@com.com | gloria@com.com |               2 | Y              |
|  3 | linda@com.com | susan@com.com  |               7 | Y              |
|  4 | john@com.com  | carmen@com.com |               5 | Y              |
|  5 | linda@com.com | aaron@com.com  |              25 | N              |
+----+---------------+----------------+-----------------+----------------+

以下是 SCORE_ENTRY 表的示例数据:

+----+---------------+----------------+-------+
| ID | manager_email | employee_email | Score |
+----+---------------+----------------+-------+
|  1 | linda@com.com | gloria@com.com | 85.04 |
|  2 | linda@com.com | susan@com.com  |   100 |
|  3 | john@com.com  | carmen@com.com | 80.50 |
+----+---------------+----------------+-------+

因此,现在我想显示每个经理需要进行的审核数量,完成的数量以及完成的百分比。

+-------------------------------+----------------------------------------------------------------------------+--------------------------------------------+-----------------------+
| Manager(list from "HR" table) | Total Audits Required(Sum of audits required from "REQUIRED_AUDITS table") | Audits Performed(from "SCORE_ENTRY" table) | Percentage Completion |
+-------------------------------+----------------------------------------------------------------------------+--------------------------------------------+-----------------------+
| john@com.com                  |                                                                         10 |                                          1 | 10%                   |
| linda@com.com                 |                                                                          9 |                                          2 | 22.22%                |
| smith@com.com                 |                                                                          - |                                          - | -                     |
| maria@com.com                 |                                                                          - |                                          - | -                     |
| jess@com.com                  |                                                                          - |                                          - | -                     |
+-------------------------------+----------------------------------------------------------------------------+--------------------------------------------+-----------------------+

计算方法如下:
1.要计算审核数,即从 REQUIRED_AUDITS 表中:
考虑经理linda@com.com:
所需审核总数:7 + 3,因为只有两名员工符合资格
。2.已完成的审核总数:
audits_required(来自REQUIRED AUDITS表)-审核完成(来自SCORE_ENTRY表)

如前所述,我对sql的了解有限,这对我来说真的很复杂,因此在Stack Overflow中有所涉足。

感谢任何帮助。

UPDATE 为了进一步简化过程,我编写了不包含HR表的离散查询,并且在组合以下查询时需要帮助。

查询1:我称其为 “ DENOMINATOR”

SELECT required_audits.manager_email, 
       SUM(audits_required) AS "TOTAL_AUDITS_REQUIRED" 
FROM   required_audits 
WHERE  Upper(required_audits.audit_eligible) = Upper('Y') 
GROUP  BY required_audits.manager_email 
ORDER  BY "total_audits_required" DESC

+-------------------------------+-----------------------+
| required_audits.manager_email | TOTAL_AUDITS_REQUIRED |
+-------------------------------+-----------------------+
| john@com.com                  |                    10 |
| linda@com.com                 |                     9 |
+-------------------------------+-----------------------+

查询2:我称其为 “ NUMERATOR”

SELECT score_entry.manager_email, 
       Count(id) 
FROM   score_entry 
GROUP  BY score_entry.manager_email

+---------------------------+-----------+
| score_entry.manager_email | Count(id) |
+---------------------------+-----------+
| john@com.com              |         1 |
| linda@com.com             |         2 |
+---------------------------+-----------+

在最终结果中,我只需要NUMERATOR / DENOMINATOR * 100%。我对join和在where子句中应用条件感到困惑。

+---------------+-----------------------+------------------+-----------------------+
|    Manager    | Total Audits Required | Audits Performed | Percentage Completion |
+---------------+-----------------------+------------------+-----------------------+
| john@com.com  |                    10 |                1 | 10%                   |
| linda@com.com |                     9 |                2 | 22.22%                |
+---------------+-----------------------+------------------+-----------------------+

在结果表上,仅应显示符合审计条件的数字。这是哪里出了问题的另一个原因。

提前致谢。

谢谢


问题答案:

您可以使用多个公用表表达式,分别计算每个表并将它们连接在一起-只是为了您了解发生了什么。

SQL小提琴

查询

WITH aud(manager_email,Total_audits) AS
  (SELECT manager_email,
    SUM (
    CASE
      WHEN audit_eligible = 'Y'
      THEN audits_required
    END )
  FROM REQUIRED_AUDITS
  GROUP BY manager_email
  ),  --Total_audits

  scores(manager_email,Audits_Performed) AS
  (SELECT manager_email,
    COUNT ( ID )
  FROM SCORE_ENTRY s
  GROUP BY manager_email
  )  --Audits_Performed

SELECT h.manager_email manager,
  a.Total_audits,
  s.Audits_Performed,
  100 * s.Audits_Performed / a.Total_audits percentage_complete
FROM HR h
LEFT OUTER JOIN aud a
ON h.manager_email = a.manager_email
LEFT OUTER JOIN scores s
ON h.manager_email = s.manager_email
ORDER BY 2 DESC NULLS LAST

结果

|       MANAGER | TOTAL_AUDITS | AUDITS_PERFORMED | PERCENTAGE_COMPLETE |
|---------------|--------------|------------------|---------------------|
|  john@com.com |           10 |                1 |                  10 |
| linda@com.com |            9 |                2 |   22.22222222222222 |
| smith@com.com |       (null) |           (null) |              (null) |
|  jess@com.com |       (null) |           (null) |              (null) |
| maria@com.com |       (null) |           (null) |              (null) |


 类似资料:
  • 在Crystal Reports中,我使用以下查询(针对Oracle数据库)为报表中的单个字段生成数据: 这可以很好地工作,并基于提供的{HB_As_At_Date}(the{?}语法是Crystal将参数值嵌入SQL(SQL)的方法。不过,上述查询的内容不是我的问题——我想做的是在几个不同的日期重复运行它,并将输出输入Crystal以供在报告中使用。 假设我希望在9月的每个星期一运行这个查询,我

  • 问题内容: 我想计算上个月的总订单金额。 我得到了从当前日期获取当前月份数据的查询。 现在,我如何仅获取前一个月的数据,不包括本月。 例如,本月(7月)我赚了15,000美元,上个月(6月)我赚了14,000美元。 通过运行上述查询,我​​得到了$ 15,000。 但是我不知道如何计算上个月。 问题答案: 在这里,您可以使用它在MySQL中获取上个月的第一个月到上个月的最后一天之间的日期:

  • 问题内容: 我目前有一个表,用于存储大量项目的统计数据,例如视图,下载,购买等。为了对每个项目进行一次操作计数,我可以使用以下查询: 这给了我所有的内容以及他们的看法。然后,我可以将其他变量的“视图”更改为“购买”或“下载”。但是,这意味着对数据库的三个单独的调用。 一口气拿下所有三个都可以吗? 问题答案: 将返回一个表, 其中每个item_id和operation一行一行 ,包含三列:item_

  • 问题内容: 有什么办法可以让子查询在oracle db中返回多个列?(我知道此特定的sql会导致错误,但总的来说我想要的很好) 我想要这样的结果: 我知道可以通过联接解决此问题,但这不是我要的。 我的问题很简单,是否有办法从子查询中获取两个或多个值?也许一些解决方法使用双重?这样就没有实际的联接,但是每行都有一个新的子查询? 编辑:这是一个原则性问题。我知道,您可以使用join解决所有这些问题。您

  • 问题内容: 我很难优化我的SQLAlchemy查询。我的SQL知识非常基础,我无法从SQLAlchemy文档中获得所需的知识。 假设以下非常基本的一对多关系: 我怎么能: 查询每个父母的元组? 经过相当长的搜索时间后,我发现了如何分别查询这些值: 我试图以不同的方式将它们组合在一起,但没有设法得到我想要的。 查询所有顽皮孩子超过80%的父母?编辑:顽皮可能为NULL。 我猜想此查询将基于上一个查询

  • 问题内容: 我正在尝试在单个查询中计算两列,但结果却为medcount和uploadcount吐出了相同的值。有什么建议? 问题答案: 使用: