T-SQL return MIN 和 MAX 不同的行值
T-SQL return different row value for MIN and MAX
我有一些数据如下所示:
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
我想创建一个摘要 table 来显示一个区域,以及地方当局的最低支出和最高支出,所以像这样:
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 的新手,如果我没有正确发布,我深表歉意。
试试这个:
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];
如有任何说明,请告诉我
编辑为实际正确,样本 data/script。
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
我有一些数据如下所示:
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
我想创建一个摘要 table 来显示一个区域,以及地方当局的最低支出和最高支出,所以像这样:
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 的新手,如果我没有正确发布,我深表歉意。
试试这个:
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];
如有任何说明,请告诉我
编辑为实际正确,样本 data/script。
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