Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从单独的表中合并字段时查找销售总额的最大值_Sql_Sql Server_Join_Sum_Max - Fatal编程技术网

Sql 从单独的表中合并字段时查找销售总额的最大值

Sql 从单独的表中合并字段时查找销售总额的最大值,sql,sql-server,join,sum,max,Sql,Sql Server,Join,Sum,Max,我真的需要一些关于两个表的max和sum的帮助。所以有两张桌子 用品 +-------------+------+----------+ |supplier_id | city | supplier | +-------------+------+----------+ +----------+-------------+------------+----------+------+ | order_id | supplier_id | order_date | sale_amt | cit

我真的需要一些关于两个表的max和sum的帮助。所以有两张桌子

用品

+-------------+------+----------+
|supplier_id  | city | supplier |
+-------------+------+----------+
+----------+-------------+------------+----------+------+
| order_id | supplier_id | order_date | sale_amt | city | 
+----------+-------------+------------+----------+------+
订单

+-------------+------+----------+
|supplier_id  | city | supplier |
+-------------+------+----------+
+----------+-------------+------------+----------+------+
| order_id | supplier_id | order_date | sale_amt | city | 
+----------+-------------+------------+----------+------+
我需要以以下格式查找每个城市的顶级供应商(最大合并销售额):

+------+----------+----------+
| city | supplier | sale_amt |
+------+----------+----------+
问题 我可以找到销售金额的总和以及城市和供应商名称(供应商)罚款。
但无法获得这些销售额的最大值,因为对城市和供应商使用(group by)可以为每个城市提供多个供应商,而我只需要每个城市的顶级供应商。
如果只需要城市名称,这不会是一个问题,但需要供应商名称会导致这个问题

这是我现在使用的查询,也是我到目前为止得到的查询

SELECT s.city, s.supplier, SUM(sale_amt)
FROM Orders o
LEFT JOIN Supplies s
ON o.supplier_id = s.supplier_id
GROUP BY s.city, s.supplier
ORDER BY s.city
非常感谢您的帮助和指导

编辑:在尝试了所有的解决方案并在这里或那里遇到了障碍之后,我想到了下面我自己的混乱代码。这肯定有漏洞,可以写得更好

SELECT A.city, B.supplier, A.max_sale_amt
FROM
    (
    SELECT city, MAX(tot) as max_sale_amt
    FROM (
        SELECT supplier_id, SUM(sale_amt) as tot
        FROM Orders
        GROUP BY supplier_id ) as D
        LEFT JOIN Supplies s
        ON D.supplier_id = Supplies.id
        GROUP BY city
    ) A,

    (
    SELECT s.city, s.supplier, SUM(sale_amt) as sum_amt
    FROM Orders o, Supplies s
        WHERE o.supplier_id = s.id
    GROUP BY s.supplier, s.city
    ) B
WHERE A.city= B.city AND A.max_sale_amt= B.sum_amt

您可以在此处使用
行号

选择与s.city、s.supplier、SUM(销售金额)相关的前1名
从命令
左连接o.supplier\u id=s.supplier\u id上的物料s
s.city集团,s.supplier
订单按行编号()计算(按美国城市划分,订单按总额(销售金额)描述);

您可以在此处使用
行号

选择与s.city、s.supplier、SUM(销售金额)相关的前1名
从命令
左连接o.supplier\u id=s.supplier\u id上的物料s
s.city集团,s.supplier
订单按行编号()计算(按美国城市划分,订单按总额(销售金额)描述);

您可以按如下方式使用分析函数
densite\u RANK

select city, supplier, sm_sales_amount from
(SELECT s.city, s.supplier, SUM(sale_amt) as sm_sales_amount,
       DENSE_RANK() OVER (PARTITION BY s.city ORDER BY SUM(sale_amt) DESC) as rn
FROM Orders o
LEFT JOIN Supplies s ON o.supplier_id = s.supplier_id
GROUP BY s.city, s.supplier) t
where rn = 1;

您可以使用分析函数
densite\u RANK
,如下所示:

select city, supplier, sm_sales_amount from
(SELECT s.city, s.supplier, SUM(sale_amt) as sm_sales_amount,
       DENSE_RANK() OVER (PARTITION BY s.city ORDER BY SUM(sale_amt) DESC) as rn
FROM Orders o
LEFT JOIN Supplies s ON o.supplier_id = s.supplier_id
GROUP BY s.city, s.supplier) t
where rn = 1;
也许这样行得通

SELECT s.city
  ,s.supplier
  ,max(sale_amt)
FROM Orders   o
  ,Supplies s
WHERE o.supplier_id = s.supplier_id(+)
GROUP BY s.city
     ,s.supplier
ORDER BY s.city
也许这样行得通

SELECT s.city
  ,s.supplier
  ,max(sale_amt)
FROM Orders   o
  ,Supplies s
WHERE o.supplier_id = s.supplier_id(+)
GROUP BY s.city
     ,s.supplier
ORDER BY s.city

我没有对此进行测试,因为我太懒了,无法创建表,但我会使用临时表作为临时步骤,或者使用desc排序,然后选择top记录,或者使用temp中的max选择。大概是这样

SELECT      city, supplierid, SUM(sale_amt)
INTO        #SumSupPerCity
FROM        Orders o
GROUP BY    city, supplierid 
ORDER BY    SUM(sale_amt) DESC;

SELECT      Top 1 * 
FROM        #MaxSumSupPerCity;

我没有对此进行测试,因为我太懒了,无法创建表,但我会使用临时表作为临时步骤,或者使用desc排序,然后选择top记录,或者使用temp中的max选择。大概是这样

SELECT      city, supplierid, SUM(sale_amt)
INTO        #SumSupPerCity
FROM        Orders o
GROUP BY    city, supplierid 
ORDER BY    SUM(sale_amt) DESC;

SELECT      Top 1 * 
FROM        #MaxSumSupPerCity;

按分区分组选项也适用于您我认为按分区分组选项也适用于您我认为这将比其他解决方案具有更高的计算成本我认为?排名和左连接?与其他解决方案相比,它的成本是相同的。@它的成本实际上不会比Tim Biegeleisen的解决方案低,因为排序保持不变(假设您已经有一个索引
(s.city,s.supplier_id)
),这将比我认为的其他解决方案的计算成本更高?排名和左连接?与其他解决方案相比,它的成本相同。@但实际上它的成本不会比Tim Biegeleisen的解决方案低,因为排序保持不变(假设您已经有一个索引
(s.city,s.supplier\u id)
)在TIES上不断出错在TIES上不断出错在TIES上不断出错