如何在 SQL 中执行组合更新语句和多个不同条件?
How can I do an Combined UPDATE statement and Multiple Different Condition in SQL?
我正在使用 SQL Server 2016 并尝试使用 SQL 通过一个查询立即更新 table:
查询具有不同的 Where 条件和子查询。
我试过条件时的案例,但无法获得想要的结果
Update TPort
set DRecd =
((select IsNull(Sum(RSrate), 0) from TDiv Divd
Where TPort.SCCode = Divd.SchemeCode and
(CASE WHEN Divd.[RecordDate] > convert(varchar, TPort.TR_DATE, 101) and SCCode not in (3360,2059,291,288,2041,4003,5429,3724) THEN 1
WHEN Divd.[RecordDate] >= convert(varchar, TPort.TR_DATE, 101) and SCCode in (4003,5429,3724) THEN 1
WHEN Divd.EXDIVDATE >= convert(varchar, TPort.TR_DATE, 101) AND SCCode in (3360) THEN 1
WHEN Divd.EXDIVDATE > convert(varchar, TPort.TR_DATE, 101) AND SCCode in (2059,291,288,2041) THEN 1
ELSE 0
END )=1
and Divd.[RecordDate] < CONVERT(varchar,GETDATE(),101)
) * UNITS)
Where TType like 'Reinvestment%' and IType = '3'
这是4个查询:
Update TPort
set DRecd =
((select IsNull(Sum(RSrate), 0) from TDiv Divd
Where TPort.SCCode = Divd.Scode and Divd.[RecordDate] > convert(varchar, TPort.TR_DATE, 101)
and Divd.[RecordDate] < CONVERT(varchar,GETDATE(),101)
) * UNITS)
Where TType like 'RInvest%' and IType = '3' and SCCode not in (3360,2059,291,288,2041,4003,5429,3724)
Update TPort set DRecd = ((select IsNull(Sum(RSrate), 0) from TDiv Divd
Where TPort.SCCode = Divd.Scode and Divd.[RecordDate] >= convert(varchar, TPort.TR_DATE, 101)
and Divd.[RecordDate] < CONVERT(varchar,GETDATE(),101)
) * UNITS)
Where TType like 'RInvest%' and IType = '3' and SCCode in (4003,5429,3724)
Update TPort set DRecd = ((select IsNull(Sum(RSrate), 0) from TDiv Divd
Where TPort.SCCode = Divd.Scode and Divd.EXDIVDATE >= convert(varchar, TPort.TR_DATE, 101)
and Divd.[RecordDate] < CONVERT(varchar,GETDATE(),101)
) * UNITS)
Where TType like 'RInvest%' and IType = '3' and SCCode in (3360)
Update TPort set DRecd = ((select IsNull(Sum(RSrate), 0) from TDiv Divd
Where TPort.SCCode = Divd.Scode and Divd.EXDIVDATE > convert(varchar, TPort.TR_DATE, 101)
and Divd.[RecordDate] < CONVERT(varchar,GETDATE(),101)
) * UNITS)
Where TType like 'RInvest%' and IType = '3' and SCCode in (2059,291,288,2041)
但问题是它的 Rsrate 总和对于子查询的每个位置应该是不同的?如果你检查所有四个查询都是相同的除了有 SCcode 和
子查询条件。我希望这能让它更清楚。
如何在 MS SQL 服务器中执行此操作?
非常感激您的帮忙。谢谢!
您可以尝试使用以下语法进行更新查询 -
Update TP
SET DRecd = IsNull(Sum(RSrate), 0) * UNITS
FROM TPort TP
JOIN TDiv Divd ON TP.SCCode = Divd.SchemeCode
AND (CASE WHEN Divd.[RecordDate] > convert(varchar, TPort.TR_DATE, 101) AND SCCode not in (3360,2059,291,288,2041,4003,5429,3724) THEN 1
WHEN Divd.[RecordDate] >= convert(varchar, TPort.TR_DATE, 101) AND SCCode in (4003,5429,3724) THEN 1
WHEN Divd.EXDIVDATE >= convert(varchar, TPort.TR_DATE, 101) AND SCCode in (3360) THEN 1
WHEN Divd.EXDIVDATE > convert(varchar, TPort.TR_DATE, 101) AND SCCode in (2059,291,288,2041) THEN 1
ELSE 0 END) = 1
AND Divd.[RecordDate] < CONVERT(varchar,GETDATE(),101)
WHERE TType like 'Reinvestment%' and IType = '3'
好的,对上面的答案稍作修改就得到了答案
UPDATE TPort
SET DRecd =
((select IsNull(Sum(RSrate), 0) from TDiv Divd
Where TPort.SCCode = Divd.SchemeCode
AND (CASE WHEN Divd.[RecordDate] > convert(varchar, TPort .TR_DATE, 101) AND SCCode not in (3360,2059,291,288,2041,4003,5429,3724) THEN 1
WHEN Divd.[RecordDate] >= convert(varchar, TPort .TR_DATE, 101) AND SCCode in (4003,5429,3724) THEN 1
WHEN Divd.EXDIVDATE >= convert(varchar, TPort .TR_DATE, 101) AND SCCode in (3360) THEN 1
WHEN Divd.EXDIVDATE > convert(varchar, TPort .TR_DATE, 101) AND SCCode in (2059,291,288,2041) THEN 1
ELSE 0 END) = 1
and SCH_CODE = SCCode
) * UNITS)
Where Tran_Type in ('Reinvestment','ReinvestmentAm','ReInvestmentTI') and IType = '3' and SCH_CODE = OSch_Code
我正在使用 SQL Server 2016 并尝试使用 SQL 通过一个查询立即更新 table: 查询具有不同的 Where 条件和子查询。 我试过条件时的案例,但无法获得想要的结果
Update TPort
set DRecd =
((select IsNull(Sum(RSrate), 0) from TDiv Divd
Where TPort.SCCode = Divd.SchemeCode and
(CASE WHEN Divd.[RecordDate] > convert(varchar, TPort.TR_DATE, 101) and SCCode not in (3360,2059,291,288,2041,4003,5429,3724) THEN 1
WHEN Divd.[RecordDate] >= convert(varchar, TPort.TR_DATE, 101) and SCCode in (4003,5429,3724) THEN 1
WHEN Divd.EXDIVDATE >= convert(varchar, TPort.TR_DATE, 101) AND SCCode in (3360) THEN 1
WHEN Divd.EXDIVDATE > convert(varchar, TPort.TR_DATE, 101) AND SCCode in (2059,291,288,2041) THEN 1
ELSE 0
END )=1
and Divd.[RecordDate] < CONVERT(varchar,GETDATE(),101)
) * UNITS)
Where TType like 'Reinvestment%' and IType = '3'
这是4个查询:
Update TPort
set DRecd =
((select IsNull(Sum(RSrate), 0) from TDiv Divd
Where TPort.SCCode = Divd.Scode and Divd.[RecordDate] > convert(varchar, TPort.TR_DATE, 101)
and Divd.[RecordDate] < CONVERT(varchar,GETDATE(),101)
) * UNITS)
Where TType like 'RInvest%' and IType = '3' and SCCode not in (3360,2059,291,288,2041,4003,5429,3724)
Update TPort set DRecd = ((select IsNull(Sum(RSrate), 0) from TDiv Divd
Where TPort.SCCode = Divd.Scode and Divd.[RecordDate] >= convert(varchar, TPort.TR_DATE, 101)
and Divd.[RecordDate] < CONVERT(varchar,GETDATE(),101)
) * UNITS)
Where TType like 'RInvest%' and IType = '3' and SCCode in (4003,5429,3724)
Update TPort set DRecd = ((select IsNull(Sum(RSrate), 0) from TDiv Divd
Where TPort.SCCode = Divd.Scode and Divd.EXDIVDATE >= convert(varchar, TPort.TR_DATE, 101)
and Divd.[RecordDate] < CONVERT(varchar,GETDATE(),101)
) * UNITS)
Where TType like 'RInvest%' and IType = '3' and SCCode in (3360)
Update TPort set DRecd = ((select IsNull(Sum(RSrate), 0) from TDiv Divd
Where TPort.SCCode = Divd.Scode and Divd.EXDIVDATE > convert(varchar, TPort.TR_DATE, 101)
and Divd.[RecordDate] < CONVERT(varchar,GETDATE(),101)
) * UNITS)
Where TType like 'RInvest%' and IType = '3' and SCCode in (2059,291,288,2041)
但问题是它的 Rsrate 总和对于子查询的每个位置应该是不同的?如果你检查所有四个查询都是相同的除了有 SCcode 和 子查询条件。我希望这能让它更清楚。
如何在 MS SQL 服务器中执行此操作? 非常感激您的帮忙。谢谢!
您可以尝试使用以下语法进行更新查询 -
Update TP
SET DRecd = IsNull(Sum(RSrate), 0) * UNITS
FROM TPort TP
JOIN TDiv Divd ON TP.SCCode = Divd.SchemeCode
AND (CASE WHEN Divd.[RecordDate] > convert(varchar, TPort.TR_DATE, 101) AND SCCode not in (3360,2059,291,288,2041,4003,5429,3724) THEN 1
WHEN Divd.[RecordDate] >= convert(varchar, TPort.TR_DATE, 101) AND SCCode in (4003,5429,3724) THEN 1
WHEN Divd.EXDIVDATE >= convert(varchar, TPort.TR_DATE, 101) AND SCCode in (3360) THEN 1
WHEN Divd.EXDIVDATE > convert(varchar, TPort.TR_DATE, 101) AND SCCode in (2059,291,288,2041) THEN 1
ELSE 0 END) = 1
AND Divd.[RecordDate] < CONVERT(varchar,GETDATE(),101)
WHERE TType like 'Reinvestment%' and IType = '3'
好的,对上面的答案稍作修改就得到了答案
UPDATE TPort
SET DRecd =
((select IsNull(Sum(RSrate), 0) from TDiv Divd
Where TPort.SCCode = Divd.SchemeCode
AND (CASE WHEN Divd.[RecordDate] > convert(varchar, TPort .TR_DATE, 101) AND SCCode not in (3360,2059,291,288,2041,4003,5429,3724) THEN 1
WHEN Divd.[RecordDate] >= convert(varchar, TPort .TR_DATE, 101) AND SCCode in (4003,5429,3724) THEN 1
WHEN Divd.EXDIVDATE >= convert(varchar, TPort .TR_DATE, 101) AND SCCode in (3360) THEN 1
WHEN Divd.EXDIVDATE > convert(varchar, TPort .TR_DATE, 101) AND SCCode in (2059,291,288,2041) THEN 1
ELSE 0 END) = 1
and SCH_CODE = SCCode
) * UNITS)
Where Tran_Type in ('Reinvestment','ReinvestmentAm','ReInvestmentTI') and IType = '3' and SCH_CODE = OSch_Code