2014-08-31 2 views
0

내가이 데이터베이스를 참조하고 +에 의해 그룹에서 최대의 가치를 얻을 "공급 업체가 대부분의 제품을 제공합니다?" SQL 카운트 테이블

나는이 쿼리

select SupplierName, max(count) 
from(
    select SupplierName, count(SupplierName) as count 
    from 
     Products as p 
     inner join 
     Suppliers as s 
     on p.SupplierID = s.SupplierID 
    group by SupplierName 
) 

에 온 그러나 결과는 우측 절반 밖에 방법입니다.

SupplierName   | max(count) 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
         | 
    Zaanse Snoepfabriek | 5 

값 5는 맞지만 SupplierName은 내부 SQL 쿼리의 마지막 값입니다. 필자는 항상 max (count) 문이 자동으로 올바른 SupplierName을 제공하지만. 왜 그렇게하지 않습니까? 나는이에 대한 쿼리를 변경하는 경우

, 다 괜찮아 :

select SupplierName, max(count) 
from(
    select SupplierName, count(SupplierName) as count 
    from 
     Products as p 
     inner join 
     Suppliers as s 
     on p.SupplierID = s.SupplierID 
    group by SupplierName 
) t 
where t.count = 
(
    select max(count) 
    from(
     select SupplierName, count(SupplierName) as count 
     from 
      Products as p 
      inner join 
      Suppliers as s 
      on p.SupplierID = s.SupplierID 
     group by SupplierName 
    ) 
) 

하지만 완전히 새로운 테이블을 만드는이 방법은 단지 최대를 얻을 다음 t.count을 비교합니다. 데이터베이스가 1,000,000 건 이상인 경우 심각하게 처리됩니다.

카운트 뭔가가 다음의 최대 얻고, 그것에 상관 ID/이름을 얻을 :

은이 문제에 대한 더 우아한 방법이 있나요.

+0

? 포스트그레스? 신탁? –

+1

"*하지만 이렇게하면 완전히 새로운 테이블을 만들 수 있습니다."- 예제에는 create table 문이 없습니다. 왜'select'가 새로운 테이블을 생성한다고 생각합니까? –

+0

방금 ​​데이터베이스를 보았습니다.'Products' 테이블에는 Supplier가 판매하는 제품을 나타내는'supplierID'가 들어 있습니다. 공급자가 어떤 제품을이 데이터베이스에 저장하지 않았는지에 대한 정보. –

답변

1

시도해 볼 수 있습니까? 나는 당신이 테이블에서 MAX (COUNT)를 쿼리 할 때 올바른 일을하고 있다고 생각한다. 그리고 가장 많은 수의 값을 반환한다고 생각한다.

select S.SupplierName, R.count 
from Suppliers S 
LEFT JOIN (
    select SupplierName, count(SupplierName) as count 
    from 
     Products as p 
     inner join 
     Suppliers as s 
     on p.SupplierID = s.SupplierID 
    group by SupplierName 
) R 
ON R.SupplierName = S.SupplierName 
ORDER BY S.SupplierName 

그러나 원래 질문 인 경우 "가장 많이 구입 한 제품은 무엇입니까?", 나는이 쿼리를 사용하십시오 : 공급 업체의 공급 재료로서

SELECT p.productname, od.ProductId, SUM(Quantity)  
FROM [OrderDetails] od 
JOIN Products P 
ON od.ProductId = P.productId 
GROUP BY od.ProductId, P.Productname 
ORDER BY SUM(Quantity) DESC 

를하고, 판매 된 제품에 관련되지 않습니다. 고객은 구매자입니다. 그러나 질문은 가장 높은 수량으로 판매 된 제품의 유형에만 초점을 맞 춥니 다. 주문 세부 정보 표에서 찾을 수 있으며 제품 표와 결합하면 판매 된 모든 제품의 이름과 판매 된 수량을 지정할 수 있습니다 . 당신이 얻을 수 있도록합니다 - (SELECT TOP 1 ... MSSQL에서 약간 다른) 1

SELECT P.SupplierId, S.SupplierName, COUNT(P.SupplierID) 
FROM Products P 
JOIN Suppliers S 
ON S.SupplierId = P.SupplierId 
GROUP BY P.SupplierId, S.SupplierName 
ORDER BY COUNT(P.SupplierId) DESC 
LIMIT 1 

LIMIT :

UPDATE

그리고 대부분의 제품을 제공하는 공급 업체에 대한, 나는이 사용하는 거라고 최고의 결과. 그러나 공급 된 상품의 수가 동일한 공급 업체가있는 경우에는 최대 개수를 별도의 변수 또는 쿼리에 저장해야합니다.

SELECT S.SupplierName, t.TotalCount 
FROM Suppliers S 
JOIN 
( SELECT P.SupplierId, S.SupplierName, COUNT(P.SupplierID) as TotalCount 
    FROM Products P 
    JOIN Suppliers S 
    ON S.SupplierId = P.SupplierId 
    GROUP BY P.SupplierId, S.SupplierName) t 
ON t.SupplierId = S.SupplierId 
JOIN 
( SELECT SupplierId, SupplierName, MAX(TotalCount) as Maximum 
    FROM 
    (SELECT P.SupplierId, S.SupplierName, COUNT(P.SupplierID) as TotalCount 
    FROM Products P 
    JOIN Suppliers S 
    ON S.SupplierId = P.SupplierId 
    GROUP BY P.SupplierId, S.SupplierName) t2 
) t3  
ON t3.Maximum = t.TotalCount 
WHERE t.TotalCount = t3.Maximum 
ORDER BY t.TotalCount DESC 

당신이 원래의 질문에 게시 한 바와 같이 기본적으로 동일하므로, : 이동하는 방법이 아닌 변수를 사용 W3 스쿨 주최하는 사이트로, 여기에 잘 같은 일을 할 수있는 쿼리입니다 도움이되지는 않습니다. : \ "실제 생활"의 예가 될 경우 쿼리를 약간 정리하는 데 도움이되는 변수를 도입 할 수 있습니다.기본적으로 위의 두 번째 조인에서 사용한 쿼리의 결과를 할당하고 where 절에서이 쿼리를 참조하기 만하면됩니다.

여기에 변수에 더있다 : 당신이 사용하고있는 DBMS http://dev.mysql.com/doc/refman/5.0/en/user-variables.html

SET @max = (SELECT MAX(TotalCount) as Maximum 
    FROM 
    ( SELECT P.SupplierId, S.SupplierName, COUNT(P.SupplierID) as TotalCount 
     FROM Products P 
     JOIN Suppliers S 
     ON S.SupplierId = P.SupplierId 
     GROUP BY P.SupplierId, S.SupplierName) t); 

SELECT S.SupplierName, t.TotalCount 
FROM Suppliers S 
JOIN 
( SELECT P.SupplierId, S.SupplierName, COUNT(P.SupplierID) as TotalCount 
    FROM Products P 
    JOIN Suppliers S 
    ON S.SupplierId = P.SupplierId 
    GROUP BY P.SupplierId, S.SupplierName) t 
ON t.SupplierId = S.SupplierId 
WHERE t.TotalCount = @max 
ORDER BY t.TotalCount DESC 
+0

예, 질문은 오해의 소지가 있었지만 문제는 같습니다. 주문한 테이블 대신 한 줄을 어떻게 얻을 수 있습니까? 답변이 목록이 아니라 단일 항목이면 안됩니다. –