我该如何解决这个 (SQL) 查询?
How do I solve this (SQL) query?
这可能是有史以来最简单的查询之一,我可能只是让它变得比必须的更难,但我需要它完成。
所以,有三个 tables:
TABLE AGENT
(
A_ID INTEGER PRIMARY KEY,
A_NAME VARCHAR(20) NOT NULL,
A_ADDR VARCHAR(30) NOT NULL,
A_PHN CHAR(14) NOT NULL,
A_EMAIL VARCHAR(20) NOT NULL);
)
TABLE E_TRANSACTION
(
T_ID INTEGER PRIMARY KEY,
T_AMT FLOAT NOT NULL,
T_DATE DATE NOT NULL,
A_ID INTEGER REFERENCES AGENT(A_ID);
)
TABLE ESTATE
(
E_ID INTEGER PRIMARY KEY,
E_ADDR VARCHAR(30) NOT NULL,
T_ID INTEGER REFERENCES E_TRANSACTION(T_ID));
)
我正在尝试 运行 的查询必须回答这个问题:
2015 年 1 月 1 日至 2015 年 6 月 30 日期间售出最多房产的代理商
到目前为止,我有这个:
select A_ID, count(A_ID)
from E_TRANSACTION
where t_date >= '01-Jan-2015' and t_date < '30-June-2015'
group by A_ID;
但它太含糊了,我的导师告诉我只有售出最多房产的代理人的输出,在这种情况下,A_ID 在 E_TRANSACTION 中出现次数最多table。换句话说,它应该只输出 A_ID 在 A_ID 堆栈中具有模式编号的 E_TRANSACTION table ,它基本上显示该代理所做的交易。
我单独试过ORDER BY和GROUP BY,也试过一起试,但都没有结果。
我尝试加入两个 tables E_TRANSACTION 和 AGENT 来获得名称以及名称固定的 A_ID,但是没有'也不锻炼。我假设这是因为我输入了错误的代码或者我进行了非法操作。
直到现在,我仍然无法确定是使用 GROUP BY 还是 ORDER BY,以及我还需要什么才能让这个查询正常工作。
附加信息:
- 使用 Oracle 11g 快捷版 (sqlplus)
- 运行 所有这些都在 SQL 命令行
- SQL
的经验几乎为零
一些SQL信息:
插入代理
值(1111,'Charles Markley','111-PSHMT 方式','111-112-1122','cm@sample.example');
插入代理
values(1112, 'Laurene Lowrey', '1010 Learners St', '101-121-1211', 'll@sample.example');
插入 E_TRANSACTION
值(1001, 30000.50, '12-Jan-2015', 1111);
插入 e_transaction
值(1002, 80000.50, '20-June-2015', 1112);
插入 ESTATE
值(301,'666 Merry Ln',1001);
插入 ESTATE
values(302, '521 Ball Stain Ct', 1002);
因此,正如某些人提到的,我没有为该查询提供 足够 详细信息。
最初的尝试是收集每个代理进行的交易数量,这是通过查找每个代理的 A_ID 在 E_TRANSACTION table 中发生的次数来发现的。
为什么我认为这行得通?我没有考虑到有多个 ESTATEs 与 TRANSACTION 相关联。我将不得不在我的需求列表中更改它。我现在设置代码的方式是每笔交易不超过一个 ESTATE。因此,这意味着只有一个代理人进行该交易,该交易让某人被分配了一个地产。因此,每个 ESTATE 都有一个唯一的 TRANSACTION ID 以及进行交易的 AGENT。一个代理人最多可以出售 5 个庄园,但这些庄园只能分配一个交易 ID。
我提供了几行已经在我的数据库中实现的虚拟数据。我无法得到的是完成查询所需的正确语法或方法,上面以粗体显示。
如果您不想告诉我具体细节,请至少解决我做错的地方。也许可以解释为什么我的方法不起作用,以及为什么在此示例中使用 GROUP BY 或 ORDER BY 不起作用。
再次强调,任何帮助都是非常重要的。
— 那个随机的家伙
在日期 1 和日期 2 之间售出最多房产的代理人
关键字:代理、已售出、数量(计数)、日期
Agent 意味着您将需要: A_ID in E_Transaction Table, and A_ID in Agent table, and A_Name in agent table Sold & Count 意味着您将需要:交易 table 的计数 (*) 和交易 table
的 A_ID
所以它最终应该看起来像这样:
Select A_ID
, A_NAME
, 数(T.A_ID)
来自 E_Transaction T
内部联接
特工 A 在 A.A_ID = T.A_ID
通过...分组
T.A_ID
, A_NAME
订购方式
计数(T.A_ID)
运行这个,根据需要调试,因为我手上没有你的数据库,所以我做不到。
既然你有你的数据,你就可以直观地确认它是否落在了正确的计数、正确的代理等方面。
你们很多人还需要带上房产,因为同一个房产可以出售不止一次,这可能会影响计数,以及哪个经纪人升至最高位。
如果您有具体问题,请详细说明,我会回复。请记住,在没有看到您的数据的情况下,I/we 处于劣势。
您只查询了 E_TRANSACTION table,但从 table 结构看来,一项交易可能涉及多个财产;所以如果你想要你必须加入 tables E_TRANSACTION 和 ESTATE
的属性数量
select * from (
select * from (
select A_ID, count(E_ID) as num
from E_TRANSACTION,ESTATE
where E_TRANSACTION.t_ID=ESTATE.I_ID
and t_date >=to_date('01062014','ddmmyyyy')
and t_date < to_date('01072014','ddmmyyyy')
group by C_ID)
order by num desc)
where rownum<=1
查询更像是满足您的需要,仅加入两个 tables 即可获得 all 销售额,因此您必须按降序对数据进行排序,并且获得第一行以获得畅销书。
这就是我使用两个外部选择的原因:
排序和过滤数据
可以使用分析函数 bust 使查询更紧凑,因为您是初学者,我以说教的方式编写。
我更正了您以更独立于 oracle 默认 date/time 设置的格式表达日期的方式,您的查询没有考虑 30-jun 因为 <,我的它考虑了 6 月的所有日子。
因此,使用 Troy 关于 HAVING 子句的建议,您可以这样做:(它适用于我的 table 之一,但我会使用您的)
SELECT ET.A_ID, AG.A_NAME
FROM AGENT AG
JOIN E_TRANSACTION ET
ON ( ET.A_ID = AG.A_ID )
GROUP BY AG.A_ID, AG.A_NAME
HAVING COUNT(ET.A_ID) =
( SELECT MAX(COUNT(A_ID) FROM E_TRANSACTION
WHERE A_ID IN ( SELECT A_ID FROM AGENT )
GROUP BY A_ID )
这应该能为您提供所需的答案 - 因为计数等于 table 中的最大计数。可能有更高级的方法可以使用分析来执行此操作,但我不擅长这些功能。
这里重要的事情似乎是:
INNER JOIN
COUNT
GROUP BY
ROWNUM
所以你应该做以下事情:
SELECT * FROM (SELECT a.A_ID, a.A_NAME, COUNT(t.A_ID) AS TRANSACTION_COUNT
FROM AGENT a
INNER JOIN E_TRANSACTION t
ON t.A_ID = a.A_ID
GROUP BY a.A_ID, a.A_NAME
ORDER BY COUNT(t.A_ID) DESC)
WHERE ROWNUM = 1;
编辑
请注意在 AGENT
table 之后使用别名 a
,在 E_TRANSACTION
table 之后使用 t
。这些允许通过别名引用这些 table 中的字段,与键入整个 table 名称相比,这节省了时间和 space。
JOIN
前面没有限定符与 INNER JOIN
相同。我更喜欢使用 INNER JOIN
来表达我的意图。
就时间跨度而言 - 我想你想在内部 SELECT
中添加一个 WHERE
子句以将获取的行限制为特定时间跨度的行有兴趣。
这可能是有史以来最简单的查询之一,我可能只是让它变得比必须的更难,但我需要它完成。
所以,有三个 tables:
TABLE AGENT
(
A_ID INTEGER PRIMARY KEY,
A_NAME VARCHAR(20) NOT NULL,
A_ADDR VARCHAR(30) NOT NULL,
A_PHN CHAR(14) NOT NULL,
A_EMAIL VARCHAR(20) NOT NULL);
)
TABLE E_TRANSACTION
(
T_ID INTEGER PRIMARY KEY,
T_AMT FLOAT NOT NULL,
T_DATE DATE NOT NULL,
A_ID INTEGER REFERENCES AGENT(A_ID);
)
TABLE ESTATE
(
E_ID INTEGER PRIMARY KEY,
E_ADDR VARCHAR(30) NOT NULL,
T_ID INTEGER REFERENCES E_TRANSACTION(T_ID));
)
我正在尝试 运行 的查询必须回答这个问题:
2015 年 1 月 1 日至 2015 年 6 月 30 日期间售出最多房产的代理商
到目前为止,我有这个:
select A_ID, count(A_ID)
from E_TRANSACTION
where t_date >= '01-Jan-2015' and t_date < '30-June-2015'
group by A_ID;
但它太含糊了,我的导师告诉我只有售出最多房产的代理人的输出,在这种情况下,A_ID 在 E_TRANSACTION 中出现次数最多table。换句话说,它应该只输出 A_ID 在 A_ID 堆栈中具有模式编号的 E_TRANSACTION table ,它基本上显示该代理所做的交易。
我单独试过ORDER BY和GROUP BY,也试过一起试,但都没有结果。
我尝试加入两个 tables E_TRANSACTION 和 AGENT 来获得名称以及名称固定的 A_ID,但是没有'也不锻炼。我假设这是因为我输入了错误的代码或者我进行了非法操作。
直到现在,我仍然无法确定是使用 GROUP BY 还是 ORDER BY,以及我还需要什么才能让这个查询正常工作。
附加信息:
- 使用 Oracle 11g 快捷版 (sqlplus)
- 运行 所有这些都在 SQL 命令行
- SQL 的经验几乎为零
一些SQL信息:
插入代理
值(1111,'Charles Markley','111-PSHMT 方式','111-112-1122','cm@sample.example');
插入代理
values(1112, 'Laurene Lowrey', '1010 Learners St', '101-121-1211', 'll@sample.example');
插入 E_TRANSACTION
值(1001, 30000.50, '12-Jan-2015', 1111);
插入 e_transaction
值(1002, 80000.50, '20-June-2015', 1112);
插入 ESTATE
值(301,'666 Merry Ln',1001);
插入 ESTATE
values(302, '521 Ball Stain Ct', 1002);
因此,正如某些人提到的,我没有为该查询提供 足够 详细信息。
最初的尝试是收集每个代理进行的交易数量,这是通过查找每个代理的 A_ID 在 E_TRANSACTION table 中发生的次数来发现的。
为什么我认为这行得通?我没有考虑到有多个 ESTATEs 与 TRANSACTION 相关联。我将不得不在我的需求列表中更改它。我现在设置代码的方式是每笔交易不超过一个 ESTATE。因此,这意味着只有一个代理人进行该交易,该交易让某人被分配了一个地产。因此,每个 ESTATE 都有一个唯一的 TRANSACTION ID 以及进行交易的 AGENT。一个代理人最多可以出售 5 个庄园,但这些庄园只能分配一个交易 ID。
我提供了几行已经在我的数据库中实现的虚拟数据。我无法得到的是完成查询所需的正确语法或方法,上面以粗体显示。
如果您不想告诉我具体细节,请至少解决我做错的地方。也许可以解释为什么我的方法不起作用,以及为什么在此示例中使用 GROUP BY 或 ORDER BY 不起作用。
再次强调,任何帮助都是非常重要的。 — 那个随机的家伙
在日期 1 和日期 2 之间售出最多房产的代理人
关键字:代理、已售出、数量(计数)、日期
Agent 意味着您将需要: A_ID in E_Transaction Table, and A_ID in Agent table, and A_Name in agent table Sold & Count 意味着您将需要:交易 table 的计数 (*) 和交易 table
的 A_ID所以它最终应该看起来像这样:
Select A_ID , A_NAME , 数(T.A_ID) 来自 E_Transaction T 内部联接 特工 A 在 A.A_ID = T.A_ID 通过...分组 T.A_ID , A_NAME 订购方式 计数(T.A_ID)
运行这个,根据需要调试,因为我手上没有你的数据库,所以我做不到。
既然你有你的数据,你就可以直观地确认它是否落在了正确的计数、正确的代理等方面。
你们很多人还需要带上房产,因为同一个房产可以出售不止一次,这可能会影响计数,以及哪个经纪人升至最高位。
如果您有具体问题,请详细说明,我会回复。请记住,在没有看到您的数据的情况下,I/we 处于劣势。
您只查询了 E_TRANSACTION table,但从 table 结构看来,一项交易可能涉及多个财产;所以如果你想要你必须加入 tables E_TRANSACTION 和 ESTATE
的属性数量select * from (
select * from (
select A_ID, count(E_ID) as num
from E_TRANSACTION,ESTATE
where E_TRANSACTION.t_ID=ESTATE.I_ID
and t_date >=to_date('01062014','ddmmyyyy')
and t_date < to_date('01072014','ddmmyyyy')
group by C_ID)
order by num desc)
where rownum<=1
查询更像是满足您的需要,仅加入两个 tables 即可获得 all 销售额,因此您必须按降序对数据进行排序,并且获得第一行以获得畅销书。
这就是我使用两个外部选择的原因: 排序和过滤数据
可以使用分析函数 bust 使查询更紧凑,因为您是初学者,我以说教的方式编写。 我更正了您以更独立于 oracle 默认 date/time 设置的格式表达日期的方式,您的查询没有考虑 30-jun 因为 <,我的它考虑了 6 月的所有日子。
因此,使用 Troy 关于 HAVING 子句的建议,您可以这样做:(它适用于我的 table 之一,但我会使用您的)
SELECT ET.A_ID, AG.A_NAME
FROM AGENT AG
JOIN E_TRANSACTION ET
ON ( ET.A_ID = AG.A_ID )
GROUP BY AG.A_ID, AG.A_NAME
HAVING COUNT(ET.A_ID) =
( SELECT MAX(COUNT(A_ID) FROM E_TRANSACTION
WHERE A_ID IN ( SELECT A_ID FROM AGENT )
GROUP BY A_ID )
这应该能为您提供所需的答案 - 因为计数等于 table 中的最大计数。可能有更高级的方法可以使用分析来执行此操作,但我不擅长这些功能。
这里重要的事情似乎是:
INNER JOIN
COUNT
GROUP BY
ROWNUM
所以你应该做以下事情:
SELECT * FROM (SELECT a.A_ID, a.A_NAME, COUNT(t.A_ID) AS TRANSACTION_COUNT
FROM AGENT a
INNER JOIN E_TRANSACTION t
ON t.A_ID = a.A_ID
GROUP BY a.A_ID, a.A_NAME
ORDER BY COUNT(t.A_ID) DESC)
WHERE ROWNUM = 1;
编辑
请注意在 AGENT
table 之后使用别名 a
,在 E_TRANSACTION
table 之后使用 t
。这些允许通过别名引用这些 table 中的字段,与键入整个 table 名称相比,这节省了时间和 space。
JOIN
前面没有限定符与 INNER JOIN
相同。我更喜欢使用 INNER JOIN
来表达我的意图。
就时间跨度而言 - 我想你想在内部 SELECT
中添加一个 WHERE
子句以将获取的行限制为特定时间跨度的行有兴趣。