【问题标题】:Nested Select Query Oracle SQL嵌套选择查询 Oracle SQL
【发布时间】:2016-01-04 00:49:45
【问题描述】:

是的,我正在尝试在 Oracle SQL 中构建一个嵌套的 SELECT 查询。目标是求和时间值(存储为 NUMBERS),然后乘以小时费率。这发生在许多“案例”和“客户”身上。然后,如果货币顺序中有 DESC,则提取前 25% 的结果。

我将提供我已经启动的两个脚本。一个比另一个有用得多,但都不起作用。

脚本 1:

    SELECT  client.client_id,
        client.first_name,
        client.surname,
        case.case_id,
        CONCAT(SUM(note.time_spent), CONCAT(' ', 'Hours')) AS total_time_spent
FROM    (SELECT total_time_spent,
                solicitor.solicitor_id,
                rate.solicitor_id,
                CONCAT('£', CONCAT(total_time_spent*rate.rate_per_hour)) AS total
        FROM    rate,
                solicitor
        INNER JOIN rate
        ON rate.solicitor_id = solicitor.solicitor_id
        GROUP BY solicitor_id)  
    note, 
    case
INNER JOIN client
ON case.case_id = note.case_id
INNER JOIN note
ON rate.solicitor_id = solicitor.solicitor_id
GROUP BY    note.client_id,
            note.solicitor_id
ORDER BY case.case_id,
         client.client_id;

脚本 2:

SELECT  * 
FROM (
SELECT  client.client_id,
        client.first_name,
        client.surname
        CONCAT('£', SUM(note.time_spent*rate.rate_per_hour)) AS total
FROM    rate, note, client, case
WHERE note.solicitor_id = solicitor.solicitor_id
    AND solicitor.solicitor_id = rate.solicitor_id
    AND note.case_id = case.case_id
    AND case.client_id = client.client_id
ORDER BY total DESC
) WHERE ROWNUM <= (SELECT COUNT(*) FROM CLIENT)/4;

这里是 TABLE CREATE 脚本:

创建案例

CREATE TABLE case
(
case_id         NUMBER(4),
client_id       NUMBER(4),
description     VARCHAR(100) CONSTRAINT case_description_nn NOT NULL,
date_filed      DATE CONSTRAINT case_date_filled_nn NOT NULL,
date_closed     DATE,

CONSTRAINT case_client_id_fk FOREIGN KEY (client_id) REFERENCES client (client_id),
CONSTRAINT case_pk PRIMARY KEY (case_id)
);

创建注释

CREATE TABLE note
(
note_id         NUMBER(4),
case_id         NUMBER(4),
solicitor_id    NUMBER(2),
content         VARCHAR(500) CONSTRAINT note_content_nn NOT NULL,
time_spent      NUMBER(3) CONSTRAINT note_time_spent_nn  NOT NULL, -- I have made the assumption that time taken is recorded as an integer value, e.g. 6 [Hours] --
date_added      DATE DEFAULT (sysdate) CONSTRAINT note_date_addedd_nn NOT NULL,

CONSTRAINT note_solicitor_id_fk FOREIGN KEY (solicitor_id) REFERENCES solicitor (solicitor_id),
CONSTRAINT note_case_id_fk FOREIGN KEY (case_id) REFERENCES case (case_id),
CONSTRAINT note_pk PRIMARY KEY (note_id)
);

创建律师

CREATE TABLE solicitor
(
solicitor_id    NUMBER(2),
first_name      CHAR(15) CONSTRAINT solicitor_first_name_nn NOT NULL,
surname         CHAR(20) CONSTRAINT solicitor_surname_nn NOT NULL,
telephone       VARCHAR(11) CONSTRAINT solicitor_telephone_nn NOT NULL,
email_address   VARCHAR(50) CONSTRAINT solicitor_email_address_nn NOT NULL,

CONSTRAINT solicitor_pk PRIMARY KEY (solicitor_id)
);

创建率

CREATE TABLE rate
(
rate_id         NUMBER(2),
solicitor_id    NUMBER(2),
rate_per_hour   DECIMAL(19,4) CONSTRAINT rate_rate_per_hour_nn NOT NULL,
start_date      DATE CONSTRAINT rate_start_date_nn NOT NULL,
end_date        DATE,

CONSTRAINT rate_solicitor_id_fk FOREIGN KEY (solicitor_id) REFERENCES solicitor (solicitor_id),
CONSTRAINT rate_pk PRIMARY KEY (rate_id)
);

创建客户

CREATE TABLE client
(
client_id       NUMBER(4),
first_name      CHAR(15) CONSTRAINT client_first_name_nn NOT NULL,
surname         CHAR(20) CONSTRAINT client_surname_nn NOT NULL,
address         VARCHAR(35) CONSTRAINT client_address_nn NOT NULL,
postcode        VARCHAR(8)  CONSTRAINT client_postcode_nn NOT NUll,
telephone       VARCHAR(11) CONSTRAINT client_telephone_nn NOT NULL,
email_address   VARCHAR(50) CONSTRAINT client_email_address_nn NOT NUll,

CONSTRAINT client_pk PRIMARY KEY (client_id)
);

【问题讨论】:

  • 在您的第二个查询中,您需要有一个数字字段,它只是总和,即不与井号连接。然后尝试按该列排序……我认为应该可以……
  • @vmachan 谢谢,所以把这两个操作分开?
  • 是的,我认为您需要有 2 个字段 - 一个带有用于显示目的的井号,另一个带有用于排序的数字。两者都将是在内部查询中选择,然后您可以在外部选择中跳过或选择您想要的字段
  • total_time_spent 应该代表什么,它的分组依据是什么?您认为哪个查询“更有用”?为什么包含“不太有用”的查询?另外,请编辑问题并包含表格的 DDL。谢谢。
  • @BobJarvis total_time_spent 表示来自不同行的时间值的总值。它应该按 case.case_id 分组。第二个我认为更有用,因为它更符合逻辑。我把它包括在内是因为可能有些部分是正确的。会的。

标签: sql oracle oracle11g oracle-sqldeveloper


【解决方案1】:
    SELECT * FROM (
        SELECT  client.client_id,
                client.first_name,
                client.surname,
                CONCAT('£', SUM(note.time_spent*rate.rate_per_hour)) AS total
        FROM rate, note, client, case, solicitor
        WHERE  note.solicitor_id = solicitor.solicitor_id
        AND solicitor.solicitor_id = rate.solicitor_id
        AND note.case_id = case.case_id 
        AND case.client_id = client.client_id
    GROUP BY    client.client_id,
                client.first_name,
                client.surname
  ORDER BY total DESC
) WHERE ROWNUM <= (SELECT COUNT(*) FROM client)/4
ORDER BY total ASC;

【讨论】:

    猜你喜欢
    • 2013-01-19
    • 2019-05-06
    • 2014-07-23
    • 2022-01-23
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    • 2018-05-08
    相关资源
    最近更新 更多