简体   繁体   中英

How to get corresponding cell value of max from different column

I am just trying to get those record who have highest discounted percentage. For that i used max function. But i am not able to fetch it's corresponding column(nPackageDiscountedAdultPrice) value. I am getting wrong value in nPackageDiscountedAdultPrice column.(MYSQL).

select bs.nBusinessDetailsId,bs.strBusinessName,bs.strBusinessDescription,
pkg.nPackageDiscountedAdultPrice,pkg.nDiscountPercentage
from tblbusinessdetails bs
INNER JOIN tblvendorbusinesscategory vbs ON bs.nBusinessDetailsId=vbs.nBusinessDetailsId
INNER JOIN tblpackageassociatedoutlets pkga ON bs.nBusinessDetailsId=pkga.nOutletId
INNER JOIN tblpackagedetails pkg ON pkga.nPackageId=pkg.nPackageId
where vbs.nMainCategoryId=9;

By using above query i was getting repeated data like this: 在此处输入图像描述

For that i added group by clause for bs.nBusinessDetailsId. Then i was getting 2nd highest nDiscountPercentage which is wrong. I want 1st highest nDiscountPercentage and it's corresponding nPackageDiscountedAdultPrice

Here is my query.

select bs.nBusinessDetailsId,bs.strBusinessName,bs.strBusinessDescription,
pkg.nPackageDiscountedAdultPrice,max(pkg.nDiscountPercentage)
from tblbusinessdetails bs
INNER JOIN tblvendorbusinesscategory vbs ON bs.nBusinessDetailsId=vbs.nBusinessDetailsId
INNER JOIN tblpackageassociatedoutlets pkga ON bs.nBusinessDetailsId=pkga.nOutletId
INNER JOIN tblpackagedetails pkg ON pkga.nPackageId=pkg.nPackageId
where vbs.nMainCategoryId=9 group by bs.nBusinessDetailsId;

I guess you want the nPackageDiscountedAdultPrice value for the row with the largest nDiscountPercentage .

That's best retrieved with a fairly tricky subquery

              SELECT a.* 
                FROM tblpackagedetails a
                JOIN (SELECT MAX(nDiscountPercentage) nDiscountPercentage,
                             nPackageId
                        FROM tblpackagedetails
                       GROUP BY nPackageId
                     ) b ON a.nDiscountPercentage = b.nDiscountPercentage
                        AND a.nPackageId = b.nPackageId

You can test this. Its inner query finds the largest discount for each package. Then it uses that value in a JOIN to give you a subset of the rows from tblpackagedetails having the largest percentage discount for each nPackageId . If more than one row has the same exact largest discount, you'll get them all and have duplicates in your final result set.

Then you join it in to your main query.

select bs.nBusinessDetailsId,bs.strBusinessName,bs.strBusinessDescription,
       pkg.nPackageDiscountedAdultPrice,pkg.nDiscountPercentage
  from tblbusinessdetails bs
 INNER JOIN tblvendorbusinesscategory vbs 
            ON  bs.nBusinessDetailsId=vbs.nBusinessDetailsId
 INNER JOIN tblpackageassociatedoutlets pkga 
            ON bs.nBusinessDetailsId=pkga.nOutletId
 INNER JOIN ( SELECT a.* 
                FROM tblpackagedetails a
                JOIN (SELECT MAX(nDiscountPercentage) nDiscountPercentage,
                             nPackageId
                        FROM tblpackagedetails
                       GROUP BY nPackageId
                     ) b ON a.nDiscountPercentage = b.nDiscountPercentage
                        AND a.nPackageId = b.nPackageId
            ) pkg ON pkga.nPackageId=pkg.nPackageId
 where vbs.nMainCategoryId=9;

Notice that the MAX()... GROUP BY... aggregate is moved to the subquery.

You should join the subquery for maxPerc group by nBusinessDetailsId (without the price)

select  t.nBusinessDetailsId
        ,t.strBusinessName
        ,t.strBusinessDescription
        ,pkg.nPackageDiscountedAdultPrice
        ,t.maxPerc
from (
    select bs.nBusinessDetailsId
        , bs.strBusinessName
        , bs.strBusinessDescription
        , max(pkg.nDiscountPercentage) maxPerc
    from tblbusinessdetails bs
    INNER JOIN tblvendorbusinesscategory vbs ON bs.nBusinessDetailsId=vbs.nBusinessDetailsId
    INNER JOIN tblpackageassociatedoutlets pkga ON bs.nBusinessDetailsId=pkga.nOutletId
    INNER JOIN tblpackagedetails pkg ON pkga.nPackageId=pkg.nPackageId
    where vbs.nMainCategoryId=9 
    group by bs.nBusinessDetailsId
) t  
INNER JOIN tblpackageassociatedoutlets pkga ON t.nBusinessDetailsId=pkga.nOutletId
INNER JOIN tblpackagedetails pkg ON pkga.nPackageId=pkg.nPackageId
    AND t.maxPerc =pkg.nDiscountPercentage

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM