自连接多个计数列

时间:2013-07-12 23:13:18

标签: sql join

我需要写一个查询,并且很难得出结果。

这是我的专栏

EMAIL ITEM PRODUCT_CATEGORY

我需要选择特定电子邮件地址至少浏览过两次类别且至少有两种不同产品的位置

因此记录可能如此

Email       ITEM     CATEGORY
joe@gmail   Bread    FOOD
joe@gmail   Banana   FOOD
joe@gmail   Grapes   FOOD
joe@gmail   Hammer   Tools
joe@gmail   Hammer   Tools
joe@gmail   File     Tools
meg@gmail   Grass    GARDEN
meg@gmail   Grass    GARDEN
meg@gmail   Grass    GARDEN
meg@gmail   Grass    GARDEN

我希望结果如下所示。梅格失踪了因为她的物品都是一样的

Email           Categroy    DistinctItemCount
joe@gmail.com   Food        3  
joe@gmail.com   Tools       2

我已经涵盖了类别但我无法看到如何添加项目计数要求

select * from
(
  select Email ,Product_Category, count(Product_Category) As CatCount
  from Browsed 
  group by Email, Product_Category
)     a 
where CatCount >1

我一直在看这个。

如果你能提供帮助,请提前感谢。

2 个答案:

答案 0 :(得分:1)

尝试这个(应该在主要的RDBMS上一致地工作)

SELECT Email, Product_Category Category, COUNT(DISTINCT Item) DistinctItemCount
  FROM Browsed 
 GROUP BY Email, Product_Category
HAVING COUNT(DISTINCT Item) > 1 

输出:

|     EMAIL | CATEGORY | DISTINCTITEMCOUNT |
--------------------------------------------
| joe@gmail |     FOOD |                 3 |
| joe@gmail |    Tools |                 2 |

这是 SQLFiddle 演示(MySql)
这是 SQLFiddle 演示(SQL Server)

以后请在发布SQL查询问题时指定RDBMS及其版本

答案 1 :(得分:0)

让我们首先消除输入表中的所有重复条目。 http://sqlfiddle.com/#!2/51991/3/0

SELECT DISTINCT Email, ITEM, CATEGORY 
 FROM Browsed

接下来,让我们按类别获取每个类别中有两个或更多产品的产品数量。我们在这个内部使用第一个查询。 http://sqlfiddle.com/#!2/51991/7/0这是用户和类别的列表,用户在每个类别中查找两个或更多不同的产品。

SELECT Email, Category, COUNT(*) Prodcount
  FROM (

         SELECT DISTINCT Email, ITEM, CATEGORY 
           FROM Browsed
        ) U 
  GROUP BY Email, Category
  HAVING Prodcount >= 2

接下来,我们想要了解查找两个或更多不同类别的用户。其工作方式如下:http://sqlfiddle.com/#!2/51991/8/0

SELECT Email, COUNT(*) Catcount
  FROM (

         SELECT DISTINCT Email, CATEGORY 
           FROM Browsed
        ) V
  GROUP BY Email
 HAVING Catcount >= 2

冷却。现在我们知道用户在运行中的用途。这些用户的名称同时显示在这些结果集中......两个或更多类别,每个类别中有两个或更多项目。 http://sqlfiddle.com/#!2/8673a/1/0

SELECT W.Email, W.Category, W.Prodcount 
  FROM (
  SELECT Email, Category, COUNT(*) Prodcount
        FROM (

               SELECT DISTINCT Email, ITEM, CATEGORY 
                 FROM Browsed
              ) U 
      GROUP BY Email, Category
      HAVING Prodcount >= 2
   ) W
   WHERE W.Email IN
   (
     SELECT Email 
       FROM (
             SELECT DISTINCT Email, CATEGORY 
               FROM Browsed
            ) V 
      GROUP BY Email
     HAVING COUNT(*) >= 2
    )