你会如何使用SQL Server 2005做到这一点?

时间:2012-11-11 23:26:46

标签: sql sql-server

假设我有一个表table1,结构如下:

  id date v1   v2  v3  v4 ... vn
  ------------------------------
  1   03   Y    N  89  77 ... x
  1   04   N    N  9   7  ... i
  1   05   N    Y  6   90 ... j
  1   06   N    Y  9   34 ... i
  1   07   N    Y  0   88 ... i
  2   03   N    N  9   77 ... f
  2   04   Y    Y  90  7  ... y
  2   05   Y    N  6   90 ... v
  2   06   N    Y  9   34 ... i
  2   07   N    N  10  88 ... i

正如您可能看到的,该表每个id有五行。我想创建两个新列:

-summarystory:=此变量是针对日期介于0507之间的行计算的,并且是最后三行的变量v3的总和。

让我更好地解释一下:前两行(date 03和04)必须有NULL个值,但date=05行是最后三行的总和{{ 1}}值,即v3。同样,89+9+6=104行必须等于date=06。必须为每个id和每个日期执行此操作。

这是理想的结果:

9+6+9=24
  • VcountYN:=每行的Y数(仅基于变量 id date v3 summarystory ------------------------- 1 03 89 NULL 1 04 9 NULL 1 05 6 104 1 06 9 24 1 07 0 15 2 03 9 NULL 2 04 90 NULL 2 05 6 105 2 06 9 105 2 07 10 25 v1)。所以。例如,对于第一行,它将是VcountYN = 1。必须为所有行计算此变量。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

以下是如何进行计算。把它变成新表是一个练习:

-- SQL 2012 version
Select
  t.id,
  t.[date],
  Case When [Date] Between 5 And 7 Then 
    Sum(v3) over (
      partition by 
        id 
       order by 
         [date]
       rows between 
         2 preceding and current row
    ) Else Null End,
  Case When v1 = 'Y' Then 1 Else 0 End +
    Case When v2 = 'Y' Then 1 Else 0 End
From
  table1 t;

-- SQL 2005 version
Select
  t1.id,
  t1.[date],
  Case When t1.[date] Between 5 And 7 Then t1.v3 + IsNull(t2.v3, 0) + IsNull(t3.v3, 0) Else Null End,
  Case When t1.v1 = 'Y' Then 1 Else 0 End +
    Case When t1.v2 = 'Y' Then 1 Else 0 End
From
  table1 t1
    Left Outer Join
  table1 t2
    On t1.id = t2.id and t1.[date] = t2.[date] + 1
    Left Outer Join
  table1 t3
    On t2.id = t3.id and t2.[date] = t3.[date] + 1

http://sqlfiddle.com/#!6/a1c45/2