簡體   English   中英

在SQL Server中使用2個組合表中的最大值創建一個表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM