简体   繁体   English

如何从sum()子查询中获取max()金额

[英]How to get the max() amount from a sum() subquery

My sub-query gets me the brand name and sum of the of the sales amount from 2013. My main query is trying to get the brand name and the highest sales amount from that year but this will return duplicate because the query will try to get the max(amount) for each brand name. 我的子查询为我提供了2013年以来的品牌名称和销售额的总和。我的主要查询是尝试获取该年的品牌名称和最高销售额,但这将返回重复值,因为查询将尝试获取每个品牌名称的最大值(金额)。 How do I filter it so it will just return the highest amount with only one brand name? 如何过滤它,使其仅返回一个品牌名称就返回最高金额? This is my query so far, any pointers would be helpful. 到目前为止,这是我的查询,任何指针都将有所帮助。 Thanks! 谢谢!

SELECT
maxamt.brnd_nm, 
MAX(maxamt.amt) AS amt


FROM
(
SELECT 
c.brnd_nm AS BRND_NM,
SUM(b.sales_amt) AS AMT

FROM prd.client  A

INNER JOIN db1.table1  B
ON b.pty_key = a.pty_key
INNER JOIN db1.table2 c
ON b.d_key = c.d_key
INNER JOIN db1.table3 d
ON b.posat_key = d.posat_key
INNER JOIN db1.table4 e
ON b.frmly_key = e.frmly_key
WHERE   B.date BETWEEN '2013-01-01' 
    AND '2013-12-31'
    AND b.C_ID IN ( 'abc', 'def', 'wqs')

GROUP BY 1
) MaxAmt
GROUP BY 1

You don't need a subquery, just use ORDER BY and LIMIT : 您不需要子查询,只需使用ORDER BYLIMIT

SELECT 
    c.brnd_nm AS BRND_NM,
    SUM(b.sales_amt) AS AMT

FROM prd.client  A

INNER JOIN db1.table1  B
    ON b.pty_key = a.pty_key
INNER JOIN db1.table2 c
    ON b.d_key = c.d_key
INNER JOIN db1.table3 d
    ON b.posat_key = d.posat_key
INNER JOIN db1.table4 e
    ON b.frmly_key = e.frmly_key
WHERE   B.date BETWEEN '2013-01-01' 
    AND '2013-12-31'
    AND b.C_ID IN ( 'abc', 'def', 'wqs')

GROUP BY BRND_NM
ORDER BY AMT DESC
LIMIT 1

Can't you use the TOP operator?: 您不能使用TOP运算符吗:

SELECT TOP 1 *
FROM (  SELECT  c.brnd_nm AS BRND_NM,
                SUM(b.sales_amt) AS AMT
        FROM prd.client  A
        INNER JOIN db1.table1  B
            ON b.pty_key = a.pty_key
        INNER JOIN db1.table2 c
            ON b.d_key = c.d_key
        INNER JOIN db1.table3 d
            ON b.posat_key = d.posat_key
        INNER JOIN db1.table4 e
            ON b.frmly_key = e.frmly_key
        WHERE   B.date BETWEEN '2013-01-01' 
            AND '2013-12-31'
            AND b.C_ID IN ( 'abc', 'def', 'wqs')

        GROUP BY c.brnd_nm) MaxAmt
ORDER BY AMT DESC

You can use QUALIFY plus ROW_NUMBER: 您可以使用QUALIFY加ROW_NUMBER:

SELECT 
c.brnd_nm AS BRND_NM,
SUM(b.sales_amt) AS AMT

FROM prd.client  A

INNER JOIN db1.table1  B
ON b.pty_key = a.pty_key
INNER JOIN db1.table2 c
ON b.d_key = c.d_key
INNER JOIN db1.table3 d
ON b.posat_key = d.posat_key
INNER JOIN db1.table4 e
ON b.frmly_key = e.frmly_key
WHERE   B.date BETWEEN '2013-01-01' 
    AND '2013-12-31'
    AND b.C_ID IN ( 'abc', 'def', 'wqs')

GROUP BY 1
QUALIFY
   ROW_NUMBER() 
   OVER (ORDER BY AMT DESC) = 1

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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