我有一个项目表:
ItemID ItemNumber CategoryID
----------------------------------
1 1 1
2 2 1
3 3 1
4 1 2
5 2 2
6 3 2
7 1 3
8 2 3
9 3 3
分类表:
CategoryID CategoryNumber GenreID
---------------------------------------
1 1 1
2 2 2
3 3 3
和一个不相关的类型表。
要求我确保ItemNumber 1对于GenreID 1是唯一的。即,只有一个ItemNumber为1的Item属于GenreID为1的Genre类别。
如何编写SQL查询以获取同一类型中具有相同ItemNumber的项目数或违反此业务规则的项目?它真的令人难以置信,我需要专业的SQL帮助。
答案 0 :(得分:4)
您可以尝试以下查询
select i.ItemNumber, c.GenreID, count(*)
from Item i, Category c
where i.CategoryID = c.CategoryID
group by i.ItemNumber, c.GenreID
having count(*) > 1
答案 1 :(得分:2)
您需要将表格连接在一起并计算每个项目的不同类型。如果我正确理解您的问题,结果查询是这样的:
select i.itemnumber, count(distinct c.genreid) as numgenres
from items i join
categories c
on i.categoryid = c.categoryid
group by i.itemnumber
having count(distinct c.genreid) > 1
order by numgenres desc;
答案 2 :(得分:1)
如果我正确阅读,您想确保某个类型中的每个项目都有不同的项目编号?
SELECT c.GenreID, count(i.ItemNumber) totalCount, count(distinct i.ItemNumber) distinctCount
FROM Items i JOIN Category c ON i.CategoryID=c.CategoryID
GROUP BY c.GenreID
答案 3 :(得分:1)
如果我理解你,你希望看到每组(ItemNumber,CategoryID)的计数。在我看来,你根本不必加入类别表。以下应该这样做:
Select ItemNumber, CategoryID, count (*)
From ItemTable
Group by ItemNumber, CategoryID
要检索重复项的实例,请使用Having子句,甚至可能使用Order By来获取列表顶部的最大违规者:
Select ItemNumber, CategoryID, count (*)
From ItemTable
Group by ItemNumber, CategoryID
Having count(*) >1
Order by count(*) desc
然后,您可能希望展开此选项以返回这些违规者的唯一ID:
Select ItemID, ItemNumber, CategoryID, CountOfInstances
From (Select CountOfInstances = count (*)
From ItemTable
Group by ItemNumber, CategoryID
Having count(*) >1
)Duplicates
Inner Join ItemNumber
on ItemTable.CategoryID = Duplicates.CategoryID
and ItemTable.ItemNumber = Duplicates.ItemNumber