2017-03-22 1 views
1

내가 잘못한 실제 취업 인터뷰 SQL 질문이기 때문에 그룹에 일반적 관심사가 될 것이라고 생각했습니다. 나는 가까이에 있다고 생각하지만 누군가가 정확한 답을 제공 할 수 있습니까? 위의 표 (커피), 브랜드, 모델, 가격 및 브랜드의 최고 가격을 각 모델의 가격의 비율을 표시하는 코드를 제공을 위해그룹 별 SQL 값의 최대 값 대 그룹 별 최대 값 값

Brand | Model | Price 
Braun | KF7150 | 98 
Braun | KF7000 | 70 
Braun | KF400 | 55 
Krups | KM730 | 67 
Krups | KM4689 | 130 
Krups | EC311 | 50 

가장 가까운 2 소수점 반올림.

이 코드는 단순히 전체적인 최대 가격 (130)을 선택하기 때문에 잘못되었습니다.

SELECT Brand, Model, Price, ROUND(Price/(SELECT MAX(Price) FROM Coffee),2) 
as Price_to_Brand_Highest 
FROM Coffee 
ORDER BY Brand; 

자기 조인을 시도했지만 각 가격이 1로 나뉘어 모든 비율이 1로 돌아 왔습니다.

SELECT C1.Brand, C1.Model, C1.Price, ROUND(C1.Price/(SELECT MAX(C2.Price) 
    FROM Coffee where C1.Brand=C2.Brand),2) as Price_to_Brand_Highest 
FROM Coffee C1 
JOIN Coffee C2 on C1.Model=C2.Model 
GROUP BY C1.Model 
ORDER BY C1.Brand; 
+0

제거 '(= C1.Model C2.Model' 커피 C2에 가입 GROUP'을 C1.Model' 의해 C2' '로 서브 쿼리 테이블 별칭 1.0 분자 또는 분모 곱 상관 하위 쿼리에서) 정수 나누기를 피하기 위해. –

답변

4

당신은 DBMS를 지정하지 않은, 그래서 이것은 ANSI 표준 SQL이다 :

select brand, model, price, 
     round(price/max(price) over (partition by brand), 2) as price_ratio 
from coffee 
order by brand, model; 

온라인 예 : http://rextester.com/HFZZRP41164 윈도우 함수는 표준 SQL에 추가되기 전에

+0

rextester에 예제를 작성해 주셔서 감사합니다. 죄송합니다, 나는 이것을 SQL 대신에 mysql로 ​​태그를 붙였을 것이라고 생각했지만, 그것은 내가 사용하고 있던 DBMS이다. –

2

, 하나 개의 방법이 될 것이다 최대 값을 계산하는 하위 쿼리에 조인 할 수 있습니다.

SELECT 
C1.*, 
ROUND(C1.Price/C2.MaxBrandPrice, 2) as Price_to_Brand_Highest 
FROM Coffee C1 
JOIN (
    Select Brand, max(Price) as MaxBrandPrice 
    From Coffee 
    Group by Brand 
) C2 
on (C1.Brand = C2.Brand) 
ORDER BY C1.Brand, C1.Model; 
+0

감사합니다. 나는 이것이 그들이 mysql에서 찾고있는 대답이라고 믿는다. –

+0

그것은 그와 비슷한 것이었다. 글쎄, 면접관에게 MariaDB ([창 함수] (https://mariadb.com/kb/en/mariadb/window-functions/)가 있음)로 전환 한 다음 @a_horse_with_no_name의 대답은 쿨러 표준 SQL 솔루션. – LukStorms