当所有信息都位于一个表中时,为什么必须进行内连接?请解释。只是挂了连接。
如果您正在面试入门级分析师工作(我是),给出以下示例查询和表格描述,您对此信息还有哪些其他观察/问题?
Table: sales_data
**Field** **Description**
date Date of order|
customer_id Unique ID for Customers|
brand Unique ID for the brand of a purchased item|
quantity Quantity of item purchased|
amount Item Price
select customer_id, brand, sum(quantity*amount) as sales
from sales_data a
inner join (
select distinct customer_id
from sales_data
where lower(brand) = 'chanel'
and quantity > 0
and date >= to_date('01/01/2017','MM/DD/YYYY')
) b
on a.customer_id = b.customer_id
where date >= to_date('01/01/2017','MM/DD/YYYY')
and quantity > 0
group by customer_id, brand
答案 0 :(得分:0)
如果使用冗余信息在一个表中填充所有数据,有时需要在同一个表中进行内部联接。对于表格描述(您解释过),可以轻松拥有三个不同的表格 - 客户,品牌和具有适当关系密钥的sales_details。而且这种情况不需要自我加入(同一个表中的内部联接)。但由于数据在单个表中可用,因此该要求实际上会导致您必须使用自联接查询。根据查询的输出,显然您需要以下要求步骤 -
为了获得满足上述要求的结果,需要自我加入。
其他问题:如何重新编写避免内部联接的查询以获得相同的结果?
Ans:您可以在where语句中使用内部查询,如下所示,以获得相同的结果 -
select customer_id, brand, sum(quantity*amount) as sales
from sales_data a
where date >= to_date('01/01/2017','MM/DD/YYYY')
and quantity > 0
and a.customer_id IN (
select distinct customer_id
from sales_data
where lower(brand) = 'chanel'
and quantity > 0
and date >= to_date('01/01/2017','MM/DD/YYYY')
)
group by customer_id, brand
答案 1 :(得分:0)
是的,你是对的,你可以做一个引用表。 inner join
获取特定行,然后计算其sales
值。您可以直接执行此操作:
select customer_id, brand, sum(CASE WHEN and lower(brand) = 'chanel' THEN quantity*amount ELSE 0 END) as sales
from sales_data
where date >= to_date('01/01/2017','MM/DD/YYYY')
and quantity > 0
group by customer_id, brand
having MAX(CASE WHEN lower(brand) = 'chanel' THEN 1 ELSE 0 END) = 1;
答案 2 :(得分:0)
您的sales_data表可能包含所有客户销售的数据。所以,假设您想问一个问题,例如:
购买' chanel'的客户的总销售收入是多少?品牌?
您需要做的第一件事是确定所有已购买的客户' chanel'然后你需要去获得他们所有的其他销售额以确定总收入。
内部/子查询完全确定了它已经识别已购买的客户' chanel'品牌自2017年1月1日起。
select distinct customer_id
from sales_data
where lower(brand) = 'chanel'
and quantity > 0
and date >= to_date('01/01/2017','MM/DD/YYYY')
外部查询然后加入这些客户,并从2017年1月1日起按客户的品牌获得所有具有正数量的销售数据。
select customer_id, brand, sum(quantity*amount) as sales
from sales_data a
inner join (
Customers That Purchased 'Chanel'
) b
on a.customer_id = b.customer_id
where date >= to_date('01/01/2017','MM/DD/YYYY')
and quantity > 0
group by customer_id, brand
有使用EXISTS
或IN
来完成同样事情的方法。但是,如果IN
可能是customer_id
,请务必小心NULL
。