2012-11-25 59 views
0

我有4个表格。我试图获得每个汽车品牌的最大价值。有10个品牌。我试图得到哪个车是每个品牌最昂贵的。SQL for MAX for each group

我做的第一件事是把我想要获取信息的所有表分组。 我已经加入了品牌,模型,CLASS和VEH表格。但我不确定如何获得每个组的最大值。

SELECT B.BRAND_NAME, M.MODEL_NAME, C.CLASS_NAME, V.VEH_YEAR, V.VEH_PRICE 

FROM ((VEHICLE V INNER JOIN CLASS C ON V.CLASS_ID = C.CLASS_ID) 
INNER JOIN MODEL M ON M.MODEL_ID = V.MODEL_ID) 
INNER JOIN BRAND B ON B.BRAND_ID = M.BRAND_ID 

enter image description here

我想:

SELECT B.BRAND_NAME, M.MODEL_NAME, C.CLASS_NAME, V.VEH_YEAR, V.VEH_PRICE 
FROM (
SELECT B.BRAND_NAME, MAX(V.VEH_PRICE) 
FROM ((VEHICLE V INNER JOIN CLASS C ON V.CLASS_ID = C.CLASS_ID) 
INNER JOIN MODEL M ON M.MODEL_ID = V.MODEL_ID) 
INNER JOIN BRAND B ON B.BRAND_ID = M.BRAND_ID 
GROUP BY B.BRAND_NAME 
); 

即时得到:enter image description here

回答

1

您的加盟,如果你只想每个品牌的最高车价就可以了。这将只需要一个GROUP BYMAX()功能(请注意,您不需要Class表此):

SELECT B.BRAND_NAME, 
     MAX(V.VEH_PRICE) AS MAX_VEH_PRICE 

FROM (VEHICLE V 
    INNER JOIN MODEL M ON M.MODEL_ID = V.MODEL_ID) 
    INNER JOIN BRAND B ON B.BRAND_ID = M.BRAND_ID 

GROUP BY B.BRAND_ID, B.BRAND_NAME ; 

要获取所有车辆的那些具有最高价格的车辆数据,您需要写在一个子查询(派生表)以前的查询,然后再加入:

SELECT B.BRAND_NAME, M.MODEL_NAME, C.CLASS_NAME, V.VEH_YEAR, V.VEH_PRICE 

FROM 
    (((VEHICLE V INNER JOIN CLASS C ON V.CLASS_ID = C.CLASS_ID) 
     INNER JOIN MODEL M ON M.MODEL_ID = V.MODEL_ID) 
     INNER JOIN BRAND B ON B.BRAND_ID = M.BRAND_ID 
    ) 

    INNER JOIN 

    (SELECT M.BRAND_ID, 
      MAX(V.VEH_PRICE) AS VEH_PRICE 
     FROM (VEHICLE V 
     INNER JOIN MODEL M ON M.MODEL_ID = V.MODEL_ID) 
     GROUP BY M.BRAND_ID 
    ) AS derived 

    ON b.BRAND_ID = derived.BRAND_ID 
    AND v.VEH_PRICE = derived.VEH_PRICE ; 
+0

@ypercube嗨,我尝试了第二份声明,但我得到“加入表达不支持它突出了代码的最后一部分。 “ON(b.BRAND_ID = derived.BRAND_ID AND v.VEH_PRICE = derived.VEH_PRICE );“ – Batman

+1

立即尝试。访问在需要的地方以及不需要括号的地方相当有趣。 –

+0

是的,我删除了on声明括号,它似乎工作。我在那里通过声明顺序完成,希望我可以让它工作。除此之外,这正是我想要完成的。非常感谢你的帮助。 – Batman