如何进行查询以从两个表返回非Dup值

时间:2015-03-25 20:56:14

标签: sql

假设以下内容:

Table Parts
--------------------------------
ID  Category  Name        Price
--------------------------------
1    A        Processor    100
2    A        MotherBoard   80
3    B        Memory Card   40
4    B        HD            70
5    C        Cooler        10

Table Product_Views
    -----------------------------------
    Customer   Date            Part_ID
    -----------------------------------
    Bill      mar-24-15 17:45   1
    Wallace   mar-25-15 08:17   4
    Heather   mar-25-15 08:43   1
    Chuck     mar-25-15 09:01   5
    Cindy     mar-25-15 11:23   1

如何构建SQL查询以检索显示的大多数查看过的部分:类别,价格和视图数量,按类别分组,没有价格列的总和?我必须做一个子查询,或者在一个简单的[INNER / LEFT / RIGHT] JOIN中做一个诀窍吗?

1 个答案:

答案 0 :(得分:0)

select p.ID, p.Name, p.price, Count(v.*) "Number of Views"
from parts p 
join product_views v 
on p.id = v.part_id
group by p.ID, p.Name, p.price
order by Count(v.*) desc

这些方面应该有所作为。

编辑类别:

抱歉,我已经离开了一段时间。你想对这个类别做什么?如果您只是需要将其包含在分析中,您只需将其添加到select和group by语句中,如下所示:

select p.ID, p.Category, p.Name, p.price, Count(v.*) "Number of Views"
from parts p 
join product_views v 
on p.id = v.part_id
group by p.ID, p.Category, p.Name, p.price
order by Count(v.*) desc

但是,如果您想查看每个类别有多少观看次数,您需要平均价格或者保留价格。如果您考虑一下,在一个类别中,您有多个项目,每个项目的价格不同。所以你需要一些方法来统一这些价格,以便每个类别有一个单一的价格点。通常(并非总是),平均价格是一个类别的最具指示性的价格。查看类别级别信息的查询类似于以下内容:

select p.Category, AVG(p.price) "Average Price", Count(v.*) "Number of Views"
from parts p 
join product_views v 
on p.id = v.part_id
group by p.Category
order by Count(v.*) desc

为了免除价格,只需删除AVG(p.price)"平均价格"来自查询。

您可以将此最后一个查询与上一个查询进行比较,并查看所有差异都在select和group by语句中。 select将包含您想要查看的所有不同内容,group by语句将选择您希望在哪个级别查看这些内容。因此,如果您想要了解您的类别在整体上的表现,那么您要分组的最详细信息将只是类别列。如果您想了解每件商品的效果,那么您需要按每件商品的ID或名称进行分组。