当一个标志改变为一个新的列时,有效地提取一个列值。

问题描述 投票:-1回答:1

我有数据,每周都会被重报。在下面的表格中,我收到了列Date, Product, Location, Rate, FlagA, and FlagB。FlagC是一个计算列,它将FlagA=1的记录标记为1,如果FlagB在未来的任何记录中被标记为1的话。同样地,我需要创建一个名为FlagC_Rate的计算列,这个计算列将FlagB=1的行的Rate列中的值拉出来(例如,本例中的0.06)。有什么想法,我应该写什么select语句来获得这个FlagC_Rate的值?我复制了我的FlagC列的代码作为参考。

CODE FOR CALCULATING FLAGC列。

Select (SUM(case when FlagB = 1 then 1 else null end) OVER(Partition by product, location)) 
* (case when FlagA = 1 then 1 else null end) as FlagC FROM Table

ATTEMPT for FLAGC_RATE.

Select (SUM(case when FlagB = 1 then 1 else null end) OVER(Partition by product, location)) 
* (case when FlagA = 1 then 1 else null end) * (case when FlagB = 1 then Rate else null end) as FLAGC_Rate FROM Table

示例数据和示例我如何尝试使用FLAGC_RATE。

一月份数据

Date          Product    Location  Rate    FlagA   FlagB   FlagC FlagC_Rate
Jan 2020      WidgetA        X     0.05      1       0       0      NULL

2月数据(FlagC列得到重述和填充)。

Date          Product    Location  Rate    FlagA   FlagB   FlagC FlagC_Rate
Jan 2020      WidgetA        X     0.05      1       0       1      0.06
Feb 2020      WidgetA        X     0.06      0       1       0      NULL

3月数据(Flag C列为空,因为每个产品定位配对只会看到一条记录,该记录有FlagC和FlagC_Rate的值。

Date          Product    Location  Rate    FlagA   FlagB   FlagC FlagC_Rate
Jan 2020      WidgetA        X     0.05      1       0       1      0.06
Feb 2020      WidgetA        X     0.06      0       1       0      NULL
March 2020    WidgetA        X     0.06      0       0       0      NULL
sql-server tsql ssms
1个回答
0
投票

请尝试以下方法。

Select *
, SUM(case when FlagB = 1 then 1 else null end) OVER(Partition by product, location) * (case when FlagA = 1 then 1 else null end) as FlagC
, max(case when FlagB = 1 then Rate else null end) OVER(Partition by product, location) * (case when FlagA = 1 then 1 else null end) as FLAGC_Rate 
from data_table

请看db<>fiddle。此处.

© www.soinside.com 2019 - 2024. All rights reserved.