【问题标题】:Check consecutive values and update field检查连续值并更新字段
【发布时间】:2017-03-11 08:19:47
【问题描述】:

我这里有一张桌子:

在“周号”列中, 我有连续 5 周的数据,每周我都想检查这些情况-

1.每周我都会检查当周的积分。如果当周的积分值为-10,而前一周的积分也是-10,则在表2(下表)的totalpoints字段中添加-40 .

2.我们再次检查本周和前两周的积分。如果连续三周得分为-10,则该人的奖励为-100,并添加到表2中的总积分字段中。(下表)

3。 同样连续四个星期,即本周和前 3 周,如果积分为 -10 ,则将 -200 添加到 table2 的总积分字段。

任何人都可以帮助我如何实现这一目标。 M 使用 sql server。

【问题讨论】:

  • Bob 的结果是否应该小于 -200,因为他所有周的得分都是 -10?
  • 1) 请将您的示例数据以文本(而非图像)的形式包含在问题中,或者更好地以INSERT 语句的形式包含,以便其他人可以测试查询。 2) 你真的想要一个可以在所有三个版本的 SQL Server 上运行的答案吗?请为您使用的版本选择一个标签。
  • 对于 Bob,他将在第 2 周获得 -40,在第 3 周获得 -100,在第 4 周获得 -200。由于查询将每周运行,因此它将检查前一周的积分。 @vkp
  • 结果表是某一周的分数还是所有周的总和?
  • 结果表每周更新一次。因此,它将包含所有周的结果。是表2中的“总分”字段。

标签: sql sql-server sql-server-2008 sql-server-2005 sql-server-2012


【解决方案1】:

在这里

; WITH 
u AS (SELECT * from (values (1,'Bob'),(2,'Deepak'),(3,'Brinda'),(4,'Chriss'),(4,'Chriss')) as d (usr,name)),
N AS (SELECT * from (values (1,1,-10),(1,2,-10),(1,3,-10),(1,4,-10),(1,5,-10),(2,1,50),(2,2,40),(2,3,30),(2,4,-10),(2,5,-10),(3,1,60),(3,2,20),(3,3,40),(3,4,-10),(3,5,20),(4,1,-10),(4,2,90),(4,3,50),(4,4,30),(4,5,50)) as d (usr,wk,pt)),
sc as (
    select w.*, case w.pt when -10 then (case w1.pt when -10 then (case w2.pt when -10 then (case w3.pt when -10 then -200 else -100 end) else -40 end) else 0 end) else 0 end x
    from n w
    left join n w1 on w.usr = w1.usr and w.wk = w1.wk+1
    left join n w2 on w.usr = w2.usr and w.wk = w2.wk+2
    left join n w3 on w.usr = w3.usr and w.wk = w3.wk+3
),
l as (
    select *, pt+x as total
    from sc
),
s as (
select usr, sum(total) total
from l
group by usr
)
select u.*,t.*
from s t
inner join u on u.usr = t.usr

如果您想查看所有详细信息,请更改最终选择

select u.*,t.*
from l t
inner join u on u.usr = t.usr

在你的数据库中应该是这样的:

; WITH 
n as (
    select [EmployeeName], CAST(SUBSTRING([Week No.],5,10) AS INT) as wk, Points as pt  
    from YourTable --> Change this to your table
),
sc as (
    select w.*, case w.pt when -10 then (case w1.pt when -10 then (case w2.pt when -10 then (case w3.pt when -10 then -200 else -100 end) else -40 end) else 0 end) else 0 end x
    from n w
    left join n w1 on w.[EmployeeName] = w1.[EmployeeName] and w.wk = w1.wk+1
    left join n w2 on w.[EmployeeName] = w2.[EmployeeName] and w.wk = w2.wk+2
    left join n w3 on w.[EmployeeName] = w3.[EmployeeName] and w.wk = w3.wk+3
),
l as (
    select *, pt+x as total
    from sc
),
s as (
    select [EmployeeName], sum(total) total
    from l
    group by [EmployeeName]
)
select *
from s

【讨论】:

  • 感谢您的输入。但是假设我有 100 名员工。那么这将是一个非常长的查询。还有其他方法吗?
  • 嘿伙计,你必须使用你的表,而不是我的例子! :D 而不是表 u 和 N 你应该使用你的表
  • 我的意思是,这个查询不会随着更多数据而变得更长.. 它是固定长度:) 你只需要提供数据库中的数据,然后转换“week1”、“week2”.. 1,2..n 中的“weekn” - 您可以使用函数 CAST(SUBSTRING(WeekNo,5,10) AS INT) AS WK
  • 非常感谢。让我看看。M 无法得到你。因为你已经写了它,请你痛苦地修改上面的查询并告诉我你的意思.我有 100 名员工,每周我都会获得新数据,将在这些数据上应用此查询。无论如何,谢谢。上帝保佑
  • 表格字段和我的表格一样
猜你喜欢
  • 2011-10-30
  • 2010-12-21
  • 2012-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-03
  • 2018-07-04
  • 1970-01-01
相关资源
最近更新 更多