簡體   English   中英

根據維度之間的匹配,查找前一行的值並將其插入到同一個 SQL 數據庫表中

[英]Find and insert a value from previous row based on a match between dimensions into the same SQL database table

是否可以將組“擴展”中的“維度 3”值放入組為“整理”和“底漆”的行中?

問題是將數據發送到 SQL 的程序沒有為組“Finishing”和“Primer”提供“Dimension3”值。

數據庫表[3E_IDB_Aru].dbo.Material結構如下:

ID P_GUID 區域 團體 代碼 變體 維度1 維度2 維度3
54 519AEC 0,0504 延期 27/1 版 sj 2520 20 110
55 519AEC 0,0504 精加工 RAL 9005 (kein) 2520 20 0
56 519AEC 0,0504 精加工 RAL 9010 (kein) 2520 20 0
57 519AEC 0,1008 底漆 GW201 (kein) 2520 40 0
58 519AEC 0,1008 底漆 ZW-400 (kein) 2520 40 0
59 519AEC 0,0504 延期 27/1 版 sj 2520 20 110
60 519AEC 0,0504 精加工 RAL 9005 (kein) 2520 20 0
61 519AEC 0,0504 精加工 RAL 9010 (kein) 2520 20 0
62 519AEC 0,1008 底漆 GW201 (kein) 2520 40 0
63 519AEC 0,1008 底漆 ZW-400 (kein) 2520 40 0
64 519AEC 0,0296 延期 27/1 頂部 sj 1480 20 110
65 519AEC 0,0296 精加工 RAL 9005 (kein) 1480 20 0
66 519AEC 0,0296 精加工 RAL 9010 (kein) 1480 20 0
67 519AEC 0,0592 底漆 GW201 (kein) 1480 40 0
68 519AEC 0,0592 底漆 ZW-400 (kein) 1480 40 0

所需的結果應如下所示(值必須寫入同一個表[3E_IDB_Aru].dbo.Material ):

ID P_GUID 區域 團體 代碼 變體 維度1 維度2 維度3
54 519AEC 0,0504 延期 27/1 版 sj 2520 20 110
55 519AEC 0,0504 精加工 RAL 9005 (kein) 2520 20 110
56 519AEC 0,0504 精加工 RAL 9010 (kein) 2520 20 110
57 519AEC 0,1008 底漆 GW201 (kein) 2520 40 110
58 519AEC 0,1008 底漆 ZW-400 (kein) 2520 40 110
59 519AEC 0,0504 延期 27/1 版 sj 2520 20 110
60 519AEC 0,0504 精加工 RAL 9005 (kein) 2520 20 110
61 519AEC 0,0504 精加工 RAL 9010 (kein) 2520 20 110
62 519AEC 0,1008 底漆 GW201 (kein) 2520 40 110
63 519AEC 0,1008 底漆 ZW-400 (kein) 2520 40 110
64 519AEC 0,0296 延期 27/1 頂部 sj 1480 20 110
65 519AEC 0,0296 精加工 RAL 9005 (kein) 1480 20 110
66 519AEC 0,0296 精加工 RAL 9010 (kein) 1480 20 110
67 519AEC 0,0592 底漆 GW201 (kein) 1480 40 110
68 519AEC 0,0592 底漆 ZW-400 (kein) 1480 40 110

您可以為此使用更新。

UPDATE Material
   SET Dim3 = Dimension3
 WHERE (MaterialGroup = 'Finishing' OR MaterialGroup = 'Primer')
   AND Dim3 IS NOT NULL

但是您可能希望保持數據不變,而是在 SELECT 操作中執行此操作。 如果您已經有很多行,則尤其如此。

SELECT ID, Fieldnumber, Area, MaterialGroup, Code, Variant, 
       Dimension1, Dimension2, Dimension3,
       CASE WHEN Dim3 IS NOT NULL            THEN Dim3
            WHEN MaterialGroup = 'Finishing' THEN Dimension3
            WHEN MaterialGroup = 'Primer'    THEN Dimension3
            ELSE                                  Dim3
       END AS Dim3

如果這在您的應用程序中有意義,您甚至可以為此目的創建一個視圖。

在源數據集和目標數據集之間使用交叉應用。 源數據集使用 case when condition 找到等於 Primer 和 Finishing 的組以將維度 3 移動到 dim3 列中

declare @tmp as table(ID int,   P_GUID varchar(20), Area varchar(20),   [Group] varchar(20),    Code varchar(20),   Variant varchar(20), Dimension1 int, Dimension2 int, Dimension3 int,Dim3 int)

INSERT INTO @tmp(ID,P_GUID, Area,   [Group],    Code,   Variant,    Dimension1, Dimension2, Dimension3, Dim3)
values
 (54,'519AEC','0,0504','Extension','27/1 ver','sj',2520,20,110,NULL)
,(55,'519AEC','0,0504','Finishing','RAL 9005','(kein)',2520,20,0,NULL)
,(56,'519AEC','0,0504','Finishing','RAL 9010','(kein)',2520,20,0,NULL)
,(57,'519AEC','0,1008','Primer','GW201','(kein)',2520,40,0,NULL)
,(58,'519AEC','0,1008','Primer','ZW-400','(kein)',2520,40,0,NULL)
,(59,'519AEC','0,0504','Extension','27/1 ver','sj',2520,20,110,NULL)
,(60,'519AEC','0,0504','Finishing','RAL 9005','(kein)',2520,20,0,NULL)
,(61,'519AEC','0,0504','Finishing','RAL 9010','(kein)',2520,20,0,NULL)
,(62,'519AEC','0,1008','Primer','GW201','(kein)',2520,40,0,NULL)
,(63,'519AEC','0,1008','Primer','ZW-400','(kein)',2520,40,0,NULL)
,(64,'519AEC','0,0296','Extension','27/1 top','sj',1480,20,110,NULL)
,(65,'519AEC','0,0296','Finishing','RAL 9005','(kein)',1480,20,0,NULL)
,(66,'519AEC','0,0296','Finishing','RAL 9010','(kein)',1480,20,0,NULL)
,(67,'519AEC','0,0592','Primer','GW201','(kein)',1480,40,0,NULL)
,(68,'519AEC','0,0592','Primer','ZW-400','(kein)',1480,40,0,NULL)

update target
set
target.Dim3=source.Dim3
from @tmp as target
cross apply
(
select 
case when [Group] in('Finishing', 'Primer') then Dimension3 end Dim3
 from @tmp data
 where  target.ID=data.ID
 )source

 select * from @tmp

輸出

ID  P_GUID  Area    Group   Code    Variant Dimension1  Dimension2  Dimension3  Dim3
54  519AEC  0,0504  Extension   27/1 ver    sj  2520    20  110 NULL
55  519AEC  0,0504  Finishing   RAL 9005    (kein)  2520    20  0   0
56  519AEC  0,0504  Finishing   RAL 9010    (kein)  2520    20  0   0
57  519AEC  0,1008  Primer  GW201   (kein)  2520    40  0   0
58  519AEC  0,1008  Primer  ZW-400  (kein)  2520    40  0   0
59  519AEC  0,0504  Extension   27/1 ver    sj  2520    20  110 NULL
60  519AEC  0,0504  Finishing   RAL 9005    (kein)  2520    20  0   0
61  519AEC  0,0504  Finishing   RAL 9010    (kein)  2520    20  0   0
62  519AEC  0,1008  Primer  GW201   (kein)  2520    40  0   0
63  519AEC  0,1008  Primer  ZW-400  (kein)  2520    40  0   0
64  519AEC  0,0296  Extension   27/1 top    sj  1480    20  110 NULL
65  519AEC  0,0296  Finishing   RAL 9005    (kein)  1480    20  0   0
66  519AEC  0,0296  Finishing   RAL 9010    (kein)  1480    20  0   0
67  519AEC  0,0592  Primer  GW201   (kein)  1480    40  0   0
68  519AEC  0,0592  Primer  ZW-400  (kein)  1480    40  0   0

我使用CROSS Apply來實現這一點:

UPDATE a SET
    a.[Dimension3] = b.[Dimension3] 
FROM
    Material As a    
    CROSS Apply (
        SELECT Top 1 [Dimension3] 
        FROM Material 
        WHERE
            ( [Pos_GUID] = a.[Pos_GUID] )
            AND ( [Dimension1] = a.[Dimension1] )
            AND ( [Dimension2] = a.[Dimension2] )
            OR ( [Dimension2] * 2 = a.[Dimension2] )
            AND ( [ID] < a.[ID] ) 
            AND ( a.[Dimension3] = 0 ) 
            AND ( [Dimension3]  Is Not Null ) 
    ) As b

在此處查看 db<>fiddle

在真實數據庫中,Pos_GUID 值都是混合的,但 ID 號總是在同一個 Pos_GUID 下按升序排列。 對於 ID < a.ID 比較,我添加了 Pos_GUID 值必須相同且 Dimension1 和 Dimension2 值必須匹配的條件。

下面是刪除了一些不必要的列的實際數據庫的一部分。

ID Pos_GUID 材料組 維度1 維度2 維度3
149 2E31E29F763844DA806B9868C403E219 精加工 1361 19.5 0
149 519AEC1C7EB54C0B8DBC562A5194E38A 延期 1500 18 89.5
150 2E31E29F763844DA806B9868C403E219 底漆 1361 19.5 0
150 519AEC1C7EB54C0B8DBC562A5194E38A 精加工 1500 18 0
151 519AEC1C7EB54C0B8DBC562A5194E38A 精加工 1500 18 0
152 2E31E29F763844DA806B9868C403E219 精加工 551.67 19.5 0
152 519AEC1C7EB54C0B8DBC562A5194E38A 底漆 1500 36 0
153 2E31E29F763844DA806B9868C403E219 底漆 551.67 19.5 0
153 519AEC1C7EB54C0B8DBC562A5194E38A 底漆 1500 36 0
154 519AEC1C7EB54C0B8DBC562A5194E38A 延期 2520 20 110
155 2E31E29F763844DA806B9868C403E219 精加工 1361 19.5 0
155 519AEC1C7EB54C0B8DBC562A5194E38A 精加工 2520 20 0
156 2E31E29F763844DA806B9868C403E219 底漆 1361 19.5 0
156 519AEC1C7EB54C0B8DBC562A5194E38A 精加工 2520 20 0
157 519AEC1C7EB54C0B8DBC562A5194E38A 底漆 2520 40 0
158 2E31E29F763844DA806B9868C403E219 精加工 2000年 82 0
158 519AEC1C7EB54C0B8DBC562A5194E38A 底漆 2520 40 0
159 2E31E29F763844DA806B9868C403E219 精加工 2000年 82 0
159 519AEC1C7EB54C0B8DBC562A5194E38A 延期 2520 20 110
160 2E31E29F763844DA806B9868C403E219 底漆 2000年 164 0
160 519AEC1C7EB54C0B8DBC562A5194E38A 精加工 2520 20 0
161 519AEC1C7EB54C0B8DBC562A5194E38A 精加工 2520 20 0
162 2E31E29F763844DA806B9868C403E219 精加工 2000年 82 0
162 519AEC1C7EB54C0B8DBC562A5194E38A 底漆 2520 40 0

結果:

ID Pos_GUID 材料組 維度1 維度2 維度3
149 2E31E29F763844DA806B9868C403E219 精加工 1361 19.5 0
149 519AEC1C7EB54C0B8DBC562A5194E38A 延期 1500 18 89.5
150 2E31E29F763844DA806B9868C403E219 底漆 1361 19.5 0
150 519AEC1C7EB54C0B8DBC562A5194E38A 精加工 1500 18 89.5
151 519AEC1C7EB54C0B8DBC562A5194E38A 精加工 1500 18 89.5
152 2E31E29F763844DA806B9868C403E219 精加工 551.67 19.5 0
152 519AEC1C7EB54C0B8DBC562A5194E38A 底漆 1500 36 89.5
153 2E31E29F763844DA806B9868C403E219 底漆 551.67 19.5 0
153 519AEC1C7EB54C0B8DBC562A5194E38A 底漆 1500 36 89.5
154 519AEC1C7EB54C0B8DBC562A5194E38A 延期 2520 20 110
155 2E31E29F763844DA806B9868C403E219 精加工 1361 19.5 0
155 519AEC1C7EB54C0B8DBC562A5194E38A 精加工 2520 20 110
156 2E31E29F763844DA806B9868C403E219 底漆 1361 19.5 0
156 519AEC1C7EB54C0B8DBC562A5194E38A 精加工 2520 20 110
157 519AEC1C7EB54C0B8DBC562A5194E38A 底漆 2520 40 110
158 2E31E29F763844DA806B9868C403E219 精加工 2000年 82 0
158 519AEC1C7EB54C0B8DBC562A5194E38A 底漆 2520 40 110
159 2E31E29F763844DA806B9868C403E219 精加工 2000年 82 0
159 519AEC1C7EB54C0B8DBC562A5194E38A 延期 2520 20 110
160 2E31E29F763844DA806B9868C403E219 底漆 2000年 164 0
160 519AEC1C7EB54C0B8DBC562A5194E38A 精加工 2520 20 110
161 519AEC1C7EB54C0B8DBC562A5194E38A 精加工 2520 20 110
162 2E31E29F763844DA806B9868C403E219 精加工 2000年 82 0
162 519AEC1C7EB54C0B8DBC562A5194E38A 底漆 2520 40 110

另請參閱此 db<>fiddle 此處的實際數據庫邏輯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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