SQL中的最大和
我有一个商店、商店内的部门以及每个部门的销售额的列表,就像在子查询中使用maxsales创建的那样,但这在这里并不十分重要,我不认为:SQL中的最大和,sql,subquery,sum,max,Sql,Subquery,Sum,Max,我有一个商店、商店内的部门以及每个部门的销售额的列表,就像在子查询中使用maxsales创建的那样,但这在这里并不十分重要,我不认为: toronto baskets 500 vancouver baskets 350 halifax baskets 100 toronto noodles 275 vancouver noodles 390 halifax noodles 120 halifax fish 200 我想问一下每家商店最畅销的部门。结果应该
toronto baskets 500
vancouver baskets 350
halifax baskets 100
toronto noodles 275
vancouver noodles 390
halifax noodles 120
halifax fish 200
我想问一下每家商店最畅销的部门。结果应该如下所示:
toronto baskets 500
vancouver noodles 275
halifax fish 200
每当我使用GROUPBY时,它都会包含子查询中的所有列表。在没有临时表的情况下,有没有一种干净的方法可以做到这一点?这在Oracle中有效,其他实现可能有不同的分析函数语法,或者完全没有:
select store
, max(department) keep(dense_rank last order by sales)
, max(sales)
from (
...query that generates your results...
)
group by store
从2005年起,这将在SQL Server中起作用:
with data as
(select store, department, sales
from <your query>),
maxsales as
(select store, sales = max(sales)
from data
group by store)
select store, (select top 1 department from data where store = t.store and sales = t.sales order by [your criteria for ties]), sales
from maxsales m
我假设在出现领带时,您只想显示一个部门,因此需要显示前1个部门和[您的领带标准]来区分它们。也许这可以奏效。虽然还没有尝试过,但可能有更好的解决方案
select yourTable.store, dept, sales
from yourTable
join (
select store, max(sales) as maxSales from yourTable group by store
) tempTable on tempTable.store = yourTable.store
and tempTable.maxSales = yourTable.sales
这在SQLServer2000及更高版本中确实有效
SELECT a.Store, a.Department, a.Sales
FROM temp a
INNER JOIN
(SELECT store, max(sales) as sales
FROM temp
GROUP BY Store) b
ON a.Store = b.Store AND a.Sales = b.Sales;
这将在没有临时表的SQL Server中工作:
SELECT Store, Department, Sales FROM
(SELECT Store, Department, Sales,
DENSE_RANK() OVER (PARTITION BY Store
ORDER BY Sales DESC) AS Dense_Rank
FROM Sales) A WHERE Dense_Rank = 1
其中Sales=您的原始查询这将起作用
Select Store, Department, Sales
From yourTable A
Where Sales = (Select Max(Sales)
From YourTable
Where Store = A.Store)
下面是我的2个SQL 2005解决方案。如果两个销售数据相同,我目前看到的其他数据可能无法返回正确的数据。这取决于你的需要 第一个使用Row_Number函数,所有的行从最低到最高的销售额排列,然后是一些打破平局的规则。然后在每个商店中选择最高等级以获得结果 您可以尝试将Partion By子句添加到Row_Number函数see BOL和/或使用内部联接而不是in子句进行调查 第二,借鉴Turnkey的想法,再次对它们进行排序,但按存储分区,因此我们可以选择排名第一的一个。稠密的_秩可能会给两个相同的行提供相同的秩,因此如果store和department不是唯一的,它可能会返回两行。对于Row_编号,该编号在分区中是唯一的 需要注意的是,这可能很慢,但对于大多数数据集来说,这比其他解决方案中的子查询要快。在该解决方案中,查询必须每行运行一次,包括排序等,这可能会导致大量查询 其他查询选择每个门店的最大销售额并以这种方式返回数据,如果两个部门恰好有相同的销售额,则返回门店的重复行。最后一个查询显示了这一点
DECLARE @tbl as TABLE (store varchar(20), department varchar(20), sales int)
INSERT INTO @tbl VALUES ('Toronto', 'Baskets', 500)
INSERT INTO @tbl VALUES ('Toronto', 'Noodles', 500)
INSERT INTO @tbl VALUES ('Toronto', 'Fish', 300)
INSERT INTO @tbl VALUES ('Halifax', 'Fish', 300)
INSERT INTO @tbl VALUES ('Halifax', 'Baskets', 200)
-- Expect Toronto/Noodles/500 and Halifax/Fish/300
;WITH ranked AS -- Rank the rows by sales from 1 to x
(
SELECT
ROW_NUMBER() OVER (ORDER BY sales, store, department) as 'rank',
store, department, sales
FROM @tbl
)
SELECT store, department, sales
FROM ranked
WHERE rank in (
SELECT max(rank) -- chose the highest ranked per store
FROM ranked
GROUP BY store
)
-- Another way
SELECT store, department, sales
FROM (
SELECT
DENSE_RANK() OVER (PARTITION BY store ORDER BY sales desc,
store desc, department desc) as 'rank',
store, department, sales
FROM @tbl
) tbl
WHERE rank = 1
-- This will bring back 2 rows for Toronto
select tbl.store, department, sales
from @tbl tbl
join (
select store, max(sales) as maxSales from @tbl group by store
) tempTable on tempTable.store = tbl.store
and tempTable.maxSales = tbl.sales
什么数据库平台?sql server?甲骨文?谁会想到面条会在温哥华如此受欢迎,嗯?又是挑赢家了。这个问题应该被锁定。是的,我本来打算提出这个问题,但我认为他在SQL Server上,就像任何使用oracle的人所指定的那样……哎呀,我晚了几分钟发布了一个类似的解决方案。这个查询不会按发布的方式运行。必须执行before group by,TESTERABLE中的maxsales没有名称,select中的列需要指定其来源。我不想直截了当,但如果有人后来来,我想说清楚。这个解决方案只适用于SQL 2005及以上版本。