У меня есть база данных для системы недвижимости, и я пытаюсь создать набор результатов, который содержит самую высокую цену из всех списков для каждого офиса в системе. Он возвращает правильную максимальную цену листинга, соотнесенную с правильными офисами, но адреса / города / штаты не соотносятся с наивысшим результатом листинга.
Вот мой SQL:
SELECT o.office_name, l.address, l.city, l.state, (SELECT MAX(l.listing_price)) AS highest_listing_price
FROM offices o
JOIN agent_assignments aa
ON o.office_key = aa.office_key
JOIN client_listings cl
ON aa.assignment_key = cl.assignment_key
JOIN listings l
ON cl.listing_key = l.listing_key
GROUP BY o.office_name;
Вот результат, который он дает:
+---------------------+------------------+--------------+-------+-----------------------+
| office_name | address | city | state | highest_listing_price |
+---------------------+------------------+--------------+-------+-----------------------+
| Seqouia Real Estate | 838 Plum Rd | Jasper | IL | 679000.00 |
| Mirage Property | NULL | Orchardville | IN | 739000.00 |
| Excelsior Estates | NULL | Sandlake | IL | 605300.00 |
| Silverwood Realty | 399 Apricot Ave | Roseville | IL | 475000.00 |
| Hearthstone Nooks | 290 Highridge Dr | Roseville | IL | 925000.00 |
+---------------------+------------------+--------------+-------+-----------------------+
А вот информация из таблиц, которые я использую для этого запроса:
DROP TABLE IF EXISTS offices;
CREATE TABLE offices
(
office_key INT PRIMARY KEY,
office_name VARCHAR(50),
address VARCHAR(50),
city VARCHAR(30),
state CHAR(2),
zip_code VARCHAR(10),
phone_number VARCHAR(10),
fax_number VARCHAR(10),
email_address VARCHAR(50),
remarks VARCHAR(1000)
);
DROP TABLE IF EXISTS agent_assignments;
CREATE TABLE agent_assignments
(
assignment_key INT PRIMARY KEY,
agent_key INT REFERENCES agents (agent_key),
office_key INT REFERENCES offices (office_key),
office_manager_flag CHAR(1),
date_assigned DATE,
end_date DATE
);
DROP TABLE IF EXISTS listings;
CREATE TABLE listings
(
listing_key INT PRIMARY KEY,
listing_status INT REFERENCES listing_status (listing_status_key),
listing_type INT REFERENCES listing_types (listing_type_key),
date_listed DATE,
date_expires DATE,
date_unlisted DATE,
reason_unlisted INT REFERENCES unlisted_reasons (unlisted_reason_key),
address VARCHAR(50),
city VARCHAR(30),
state CHAR(2),
zip_code VARCHAR(10),
lot_number VARCHAR(50),
residential_area INT REFERENCES residential_areas (residential_area_key),
listing_price DECIMAL(13, 2),
listing_agreement_signed_date CHAR(1),
remarks VARCHAR(1000)
);
DROP TABLE IF EXISTS client_listings;
CREATE TABLE client_listings
(
client_listing_key INT PRIMARY KEY,
listing_key INT REFERENCES listings (listing_key),
assignment_key INT REFERENCES agent_assignments (assignment_key),
client_key INT REFERENCES clients (client_key)
);
Одна вещь, которую я пытался использовать, это коррелировать адрес, но это привело к ошибке «подзапрос возвращает более одной строки»:
WHERE l.address = (SELECT l.address FROM listings l WHERE l.listing_price = (SELECT MAX(l.listing_price)))