[英]Create a table with maximum values out of 2 combined tables in SQL Server
當前遇到SQL Server(SSMS 17.4)問題,我利用在Abc_ID
完成的唯一ID將2個具有不同列的表合並為1個表。
表格1
Abc_ID Color Value
-----------------------
1 1
2 a -0.5
2 b 0
2 c -0.1
2 d 0
2 e 0
2 f 0
2 g 1
2 h 3
2 i -5
3 a -0.9
4 a -.023
5 a 0
5 b 7.548
5 c -0.8774
6 a 1
6 b 0.5
6 c 0
7 a 2.1
7 b -1
7 c -2.5
8 a -1.1
8 b 5
表2
Abc_ID ProductLine Name
----------------------------
1 prod1 INTERCEPT
2 prod1 BASE
3 prod1 RawCost
4 prod1 FEAT1
5 prod1 FEAT2
6 prod1 FEAT3
7 prod1 FEAT4
8 prod1 FEAT5
表1僅返回物料( Abc_ID
),顏色和值,表2返回每種物料的產品線和名稱。
合並的表格現在看起來像
Abc_ID,Color, Value, Productline, name
查詢:
select
ah.Abc_ID, ah.Color, ah.value, ad.ProductLine, ad.name
From
[dbo].[table1] ah
Join
[dbo].[tl_table2] ad on ah.Abc_ID = ad.Abc_ID
現在,我想計算顏色的最大值(由於一種材料可以具有不同的顏色,因此每種材料中只有一種顏色是最昂貴的)
where
(ah.Abc_ID, ah.value) in (select ah.Abc_ID, max(ah.value)
from [dbo].[table1]
group by [dbo].[table1].Abc_ID)
但是該代碼引發了一個錯誤:
在需要條件的上下文中在“,”附近指定的非布爾類型的表達式。
我在這里做錯了什么?
預期結果應為每個Abc_ID
最大值1
Abc_ID Color Value ProductLine Name
------------------------------------------
1 1 prod1 INTERCEPT
2 h 3 prod1 BASE
3 a -0.9 prod1 RawCost
4 a -0.023 prod1 FEAT1
5 b 7.584 prod1 FEAT2
6 a 1 prod1 FEAT3
7 a 2.1 prod1 FEAT4
8 b 5 prod1 FEAT5
SQL Server不支持此語法where (ah.Abc_ID, ah.value) in
根據您的樣本數據和預期結果,這可能為您完成
declare @table1 table (Abc_ID int, Color varchar(1), Value decimal(16,2))
declare @table2 table (Abc_ID int, ProductLine varchar(10), Name varchar(10))
insert into @table1 (Abc_ID, Color, Value)
values (1, null, 1), (2, 'a', -0.5), (2, 'b', 0), (2, 'c', -0.1), (2, 'd', 0), (2, 'e', 0), (2, 'f', 0), (2, 'g', 1), (2, 'h', 3),
(2, 'i', -5), (3, 'a', -0.9), (4, 'a', -0.023), (5, 'a', 0), (5, 'b', 7.548), (5, 'c', -0.8774), (6, 'a', 1), (6, 'b', 0.5),
(6, 'c', 0), (7, 'a', 2.1), (7, 'b', -1), (7, 'c', -2.5), (8, 'a', -1.1), (8, 'b', 5)
insert into @table2 (Abc_ID, ProductLine, Name)
values (1, 'prod1', 'INTERCEPT'), (2, 'prod1', 'BASE'), (3, 'prod1', 'RawCost'), (4, 'prod1', 'FEAT1'),
(5, 'prod1', 'FEAT2'), (6, 'prod1', 'FEAT3'), (7, 'prod1', 'FEAT4'), (8, 'prod1', 'FEAT5 ')
select ah.Abc_ID,
(select top 1 ah2.Color from @table1 ah2 where ah2.Abc_ID = ah.Abc_ID order by ah2.Value desc) as Color,
max(Value) as Value,
ad.ProductLine,
ad.Name
from @table1 ah
left join @table2 ad on ah.Abc_ID = ad.Abc_ID
group by ah.Abc_ID, ad.ProductLine, ad.Name
這將產生以下結果:
Abc_ID Color Value ProductLine Name
------ ----- ----- ----------- ----
1 null 1 prod1 INTERCEPT
2 h 3 prod1 BASE
3 a -0,9 prod1 RawCost
4 a -0,023 prod1 FEAT1
5 b 7,548 prod1 FEAT2
6 a 1 prod1 FEAT3
7 a 2,1 prod1 FEAT4
8 b 5 prod1 FEAT5
您也可以自己測試它,並在這里進行撥弄http://sqlfiddle.com/#!18/a90f0/1
SQL Server在IN
篩選器中不支持多個列。 您應該改用EXISTS
。
更改
where
(ah.Abc_ID, ah.value) in (select ah.Abc_ID, max(ah.value)
from [dbo].[table1]
group by [dbo].[table1].Abc_ID)
對於
where
EXISTS (
select
'there is a match'
from
[dbo].[table1] AS T
group by
T.Abc_ID
HAVING
T.Abc_ID = ah.Abc_ID AND
max(T.value) = ah.value)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.