1

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

这是我的专栏

电子邮件项目 PRODUCT_CATEGORY

我需要选择一个特定的 emailAddress 在哪里浏览了一个类别至少 2 次并且至少有 2 个不同的产品

所以记录可能看起来像这样

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

我已经看这个很久了。

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

4

2 回答 2

1

试试这个(应该在主要的 RDBMS 中始终如一地工作)

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

输出:

| 电子邮件 | 类别 | 区别计数 |
------------------------------------------
| 乔@gmail | 食品 | 3 |
| 乔@gmail | 工具 | 2 |

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

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

于 2013-07-12T23:25:11.263 回答
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
    )
于 2013-07-12T23:44:44.260 回答