SQL计算多个表的重复值

时间:2014-08-25 22:12:51

标签: sql sql-server

我有一个项目表:

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帮助。

4 个答案:

答案 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