我需要写一个查询,并且很难得出结果。
这是我的专栏
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
我一直在看这个。
如果你能提供帮助,请提前感谢。
答案 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
)