在我的数据集中,每个人都有几个预订。人们可以预订一家或多家公司。我想计算已经与特定2家公司预订但没有任何其他公司预订的客户的预订价值。
数据的存储方式是每个人可以有几行详细说明每家公司的预订价值。
这是我到目前为止所做的:
SELECT b.booked_date, b.price
FROM person p
LEFT JOIN booking b ON p.booking_id = b.id
LEFT JOIN company c ON b.company_id = c.id
WHERE c.name IN (company1, company2)
然而,这只是计算包含company1和company2的每一行的预订值。我想做的是排除任何与公司1和公司2以外的公司预订的人。
答案 0 :(得分:1)
SELECT p.id
FROM person p
JOIN booking b ON p.booking_id = b.id
JOIN company c ON b.company_id = c.id
WHERE c.name IN (company1, company2)
GROUP BY p.id
HAVING COUNT(DISTINCT c.id)=2
该查询返回使用两家指定公司预订的客户。
然后可以在计算中使用查询
SELECT b.booked_date, b.price
FROM person p
JOIN booking b ON p.booking_id = b.id
JOIN (the query above) sub ON sub.id=p.id
答案 1 :(得分:0)
StanislavL是对的。但HAVING
只有在人们预订了两家公司时才有效。如果条件是“company1或company2之一”,那么我想下一个查询(小心,这是非常慢的查询):
SELECT b.booked_date, b.price
FROM person p
LEFT JOIN booking b ON p.booking_id = b.id
WHERE
b.id IN (
SELECT id
FROM booking b1
WHERE
b1.company_id IN (company1, company2)
AND (
SELECT COUNT(id)
FROM booking b2
WHERE
b2.id = b1.id
AND b2.company_id NOT IN(company1, company2) = 0
)
)