【问题标题】:T-SQL return different row value for MIN and MAXT-SQL 为 MIN 和 MAX 返回不同的行值
【发布时间】:2018-11-05 20:24:17
【问题描述】:

我有一些看起来像这样的数据:

LA Code Local_Authority         Region          Spend per pupil
----------------------------------------------------------------
831     Derby                   East Midlands   4370
830     Derbyshire              East Midlands   4600
822     Bedford                 East of England 4694
873     Cambridgeshire          East of England 4455
301     Barking & Dagenham      London          5377
302     Barnet                  London          4965
330     Birmingham              West Midlands   5483
331     Coventry                West Midlands   4970

我想创建一个汇总表,显示一个地区、地方当局的最低支出和最高支出,如下所示:

Region            Min_LA_Name    Min_Amount   Max_LA_Name        Max_Amount
---------------------------------------------------------------------------
East Midlands     Derby          4370         Derbyshire         4600
East of England   Cambridgeshire 4455         Bedford            4694
London            Barnet         4965         Barking & Dagenham 5377
West Midlands     Coventry       4970         Birmingham         4970

我已经得到了以下代码:

SELECT 
    Region,
    (SELECT Local_Authority 
     FROM LASpendPerPupil_df 
     GROUP BY REGION 
     HAVING MIN("Spend per pupil")) AS Min_LA_Name, 
    MIN("Spend per pupil") AS Min_Amount,
    (SELECT Local_Authority 
     FROM LASpendPerPupil_df 
     GROUP BY REGION 
     HAVING MAX("Spend per pupil")) AS Max_LA_Name,
    MAX("Spend per pupil") AS Max_Amount
FROM
    LASpendPerPupil_df
GROUP BY 
    REGION;

我得到了最小值和最大值的正确输出,但是地方当局名称列只是重复第一个区域的最小和最大名称,所以像这样:

Region            Min_LA_Name    Min_Amount   Max_LA_Name       Max_Amount
---------------------------------------------------------------------------
East Midlands     Derby          4370         Derbyshire         4600
East of England   Derby          4455         Derbyshire         4694
London            Derby          4965         Derbyshire         5377
West Midlands     Derby          4970         Derbyshire         4970

谁能帮我解决这个问题?我是 Stack Overflow 新手和 SQL 新手,如果我没有正确发布,敬请见谅。

【问题讨论】:

  • 你想如何处理领带?提示:使用适当的软件(MySQL、Oracle、DB2 等)和版本标记数据库问题很有帮助,例如sql-server-2014。语法和功能的差异通常会影响答案。请注意,tsql 缩小了选择范围,但没有指定数据库。

标签: sql-server tsql max min


【解决方案1】:

试试这个:

select a.region,b.la_name as min_la_name,a.min_amount,c.la_name as max_la_name,a.max_amount
from
(select region,min([SPEND PER PUPIL])  as min_amount, max([SPEND PER PUPIL]) as max_amount
from your_table
group by region ) a
left join
your_table b
on a.region = b.region and a.min_amount = b.[SPEND PER PUPIL]
left join
your_table c
on a.region = c.region and a.max_amount = c.[SPEND PER PUPIL];

如有任何澄清,请告诉我

【讨论】:

  • 嗨,非常感谢这篇文章。我试了一下,但我无法运行代码,我收到一条错误消息“没有这样的列:b.amount”
  • 您需要使用每个学生的专栏支出
  • 太棒了!非常感谢,抱歉,我花了一些时间才将所有内容都放在正确的位置。
  • 我很高兴你的逻辑是正确的,这就是全部目的。
【解决方案2】:

编辑为实际正确,带有示例数据/脚本。

IF OBJECT_ID('tempdb..#Tmp') IS NOT NULL
    DROP TABLE #Tmp 

CREATE TABLE #Tmp (
    [LA Code] int
    , Local_Authority VARCHAR(50)
    , Region VARCHAR(50)
    , [Spend per pupil] INT);   

INSERT INTO #Tmp VALUES
(831,'Derby','East Midlands',4370),
(830,'Derbyshire','East Midlands', 4600),
(822,'Bedford','East of England', 4694),
(873,'Cambridgeshire','East of England', 4455),
(301,'Barking & Dagenham','London',5377),
(302,'Barnet','London',4965),
(330,'Birmingham','West Midlands',5483),
(331,'Coventry','West Midlands',4970)

SELECT
    x.Region
    , (SELECT Local_Authority 
        FROM #Tmp WHERE Region=x.Region AND [Spend per pupil]=MaxSpend) AS MaxAuth
    , MaxSpend
    , (SELECT Local_Authority 
        FROM #Tmp WHERE Region=x.Region AND [Spend per pupil]=MinSpend) AS MinAuth
    , MinSpend 
FROM
    (SELECT Region, MAX([Spend per pupil]) AS MaxSpend 
    FROM #Tmp GROUP BY Region) x
LEFT OUTER JOIN
    (SELECT Region, MIN([Spend per pupil]) AS MinSpend 
    FROM #Tmp GROUP BY Region) y on x.Region = y.region

【讨论】:

  • @ChristinaBriggs 欢迎您。由于我必须在较大的查询中进行大量计算,因此我养成了将 select 语句视为表的习惯。这需要大量的外部连接来确保我的数据在“将其放在一起”之前在每个子集中都是正确的。这是一篇非常棒的文章,我建议阅读它blog.jooq.org/2016/04/25/…
  • @DougCoats 你确定这行得通吗?因为您不能获得最大的本地权限,要么必须包含在 group by 中(我们不需要),否则它将不起作用。如果我错了,请纠正我,但我们只能采用可以在 select 语句中聚合的变量,除了 group by 中的变量
猜你喜欢
  • 2012-08-26
  • 2019-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-09
  • 2017-08-24
  • 2018-07-31
  • 1970-01-01
相关资源
最近更新 更多