繁体   English   中英

在SQL中使用COUNT(Distinct)

[英]Using COUNT(Distinct ) in SQL

这是一个数据库模式:

customers (custID, firstname, familyname, town, state)  
orders (orderID, custlD, date)  
lineitems (orderID, itemlD, quantity, despatched)  
items (itemID, description, unitcost, stocklevel)  
itemSupplier (supplierID, itemlD)  
supplier (supplierID, sName, sAddress, telephoneNo, delivers)

这是问题:

如果我们假设项目表中的描述字段使用一组预定义的类别(例如,帐篷,小铲等),那么我们可以回答诸如“商店出售多少种不同类型的帐篷?”之类的问题。 编写SQL查询以列出所有出售了不止一种同类商品的所有商品,并查找出售了多少种不同类型的商品(即,带有colunm标题的列表:描述;“出售了多少种商品” “)。

我试图像这样在COUNT()函数中使用DISTINCT

SELECT description, count(DISTINCT itemID) AS how_many_types_are_sold
FROM items
GROUP BY description

我不确定是否正确使用这些功能。 有什么建议可以解决这个问题吗? 提前致谢

根据我的理解,您在select语句中不需要区分,因为group by将对每个基于项目的描述进行分组,这意味着,

SELECT description, count(*) AS how_many_types_are_sold FROM items GROUP BY description

但是,仅当且如您在问题中提到的那样所有类别都已预定义时,您才可以使用上述声明,否则会出现一些未定义的描述,在这种情况下,您需要某种映射表来将所有描述与所有类别映射有。

该查询:

SELECT description, count(DISTINCT itemID) AS how_many_types_are_sold
FROM items
GROUP BY description;

根据您的描述,这就是您想要做的。 但是。 您只应在必要时使用DISTINCT

很有可能表中名为items的表中名为itemID的列实际上是该表的主键。 如果是这样,则每一行都有一个不同的值,并且COUNT(DISTINCT)是多余的。 基于此假设,您可以只计算匹配的行数:

SELECT description, count(*) AS how_many_types_are_sold
FROM items
GROUP BY description;

这是更可取的(因为count(*)性能优于count(distinct) ),假设itemID在表中是唯一的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM