【发布时间】: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