一个简单的小组

时间:2016-09-17 14:59:18

标签: sql oracle

enter image description here

问题是列出SUPPLIER_ID,供应商名称和每个供应商提供的产品数量。仅列出提供超过2种产品的产品。 [使用产品和供应商表]

SELECT  S.SUPPLIER_ID, S.NAME, COUNT(S.PRODUCT_ID)
FROM PRODUCT P, SUPPLIER S
WHERE P.SUPPLIER_ID = S.SUPPLIER_ID
GROUP BY NAME;

SELECT SUPPLIER_ID,  COUNT(PRODUCT_ID)
FROM SUPPLIER, PRODUCT
WHERE  SUPPLIER.SUPPLIER_ID = PRODUCT.SUPPLIER_ID
GROUP BY NAME;

我尝试了两种方式,但他们不会工作。有什么问题?

4 个答案:

答案 0 :(得分:2)

首先,学会使用正确的,明确的JOIN语法。简单的规则:从不FROM子句中使用逗号; 始终使用显式JOIN语法和ON子句中的连接条件。

如果您正在学习SQL,这一点尤其重要。

其次,您的问题是SELECT中的非聚合列不在GROUP BY中。所以,我想这是你想要的查询:

SELECT  S.SUPPLIER_ID, S.NAME, COUNT(S.PRODUCT_ID)
FROM PRODUCT P JOIN
     SUPPLIER S
     ON P.SUPPLIER_ID = S.SUPPLIER_ID
GROUP BY S.SUPPLIER_ID, S.NAME
HAVING COUNT(S.PRODUCT_ID) > 1;

您需要HAVING条款以确保每个供应商至少有两种产品。

答案 1 :(得分:1)


您可以使用此查询

SELECT S.SUPPLIER_ID, S.NAME, COUNT(S.PRODUCT_ID)
FROM PRODUCT P, SUPPLIER S 
WHERE P.SUPPLIER_ID = S.SUPPLIER_ID
GROUP BY  S.SUPPLIER_ID, S.NAME;

基本上,如果要聚合列,则应在group by子句中提供select查询中的所有列

答案 2 :(得分:1)

试试这个:

SELECT  S.SUPPLIER_ID, S.NAME, COUNT(S.PRODUCT_ID) COUNTER
FROM PRODUCT P, SUPPLIER S
WHERE P.SUPPLIER_ID = S.SUPPLIER_ID
GROUP BY S.SUPPLIER_ID,S.NAME
HAVING COUNT(*)>1;

答案 3 :(得分:0)

SELECT  S.SUPPLIER_ID, S.NAME, COUNT(P.PRODUCT_ID)
FROM PRODUCT P JOIN
     SUPPLIER S
     ON P.SUPPLIER_ID = S.SUPPLIER_ID
GROUP BY S.SUPPLIER_ID, S.NAME 
HAVING COUNT(*)>1;
;