Sql 一个简单的分组
问题是列出供应商ID、供应商名称和每个供应商提供的产品数量。仅列出提供2种以上产品的产品。[使用产品和供应商表]Sql 一个简单的分组,sql,oracle,Sql,Oracle,问题是列出供应商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 W
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;
我试了两种方法,但都不管用。有什么问题 首先,学习使用正确、明确的
JOIN
语法。简单规则:在FROM
子句中不要使用逗号;始终将显式JOIN
语法与ON
子句中的连接条件一起使用
如果您正在学习SQL,这一点尤其重要
其次,您的问题是在SELECT
中有未聚合的列,这些列不在groupby
中。我想这就是你想要的查询:
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
子句来确保每个供应商至少有两种产品。首先,学习使用正确、明确的连接语法。简单规则:在FROM
子句中不要使用逗号;始终将显式JOIN
语法与ON
子句中的连接条件一起使用
如果您正在学习SQL,这一点尤其重要
其次,您的问题是在SELECT
中有未聚合的列,这些列不在groupby
中。我想这就是你想要的查询:
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
子句来确保每个供应商至少有两个产品。
您可以使用此查询
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;
基本上,如果要聚合列,则应在GROUPBY子句中提供select查询中的所有列
您可以使用此查询
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;
基本上,如果要聚合列,则应在GROUPBY子句中提供select查询中的所有列
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;
试试这个:
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;
与WHERE子句相比,使用联接提供了良好的持久性。因此,在有条件的情况下继续练习使用联接。感谢您对GROUPBY的解释。与WHERE子句相比,使用联接提供了良好的持久性。因此,请在有条件的情况下继续练习使用联接。感谢您对group by的解释。欢迎使用Stack Overflow!你可以通过解释它的工作原理来更好地回答这个问题。欢迎使用堆栈溢出!你可以通过解释它是如何工作的来更好地回答这个问题。另外,下次我将使用always join语法。谢谢。另外,下次我将使用always-join语法。非常感谢。