日期与第一个(最小)日期和下一个连续日期之间的差异直到表格结束

时间:2018-06-05 09:23:50

标签: sql sql-server-2012

我的基表有以下结构

  ID            DC_NO           DC_DATE     NOB    TAG_NO
110168  DC/NGO/270118/188   1/27/18 0:00    800  NGO/191217/17
110169  DC/NGO/270118/189   1/27/18 0:00    400  NGO/191217/17
110170  DC/NGO/270118/190   1/27/18 0:00    600  NGO/191217/17
110171  DC/NGO/270118/192   1/27/18 0:00    700  NGO/191217/17
110172  DC/NGO/270118/196   1/27/18 0:00    720  NGO/191217/17
110173  DC/NGO/290118/179   1/29/18 0:00    700  NGO/191217/17
110174  DC/NGO/290118/227   1/29/18 0:00    500  NGO/191217/17
110175  DC/NGO/300118/220   1/30/18 0:00    834  NGO/191217/17
110176  DC/NGO/300118/221   1/30/18 0:00    600  NGO/191217/17
110177  DC/NGO/300118/221   1/30/18 0:00    10   NGO/191217/17
110178  DC/NGO/020218/185   2/2/18 0:00     900  NGO/191217/17
110179  DC/NGO/020218/186   2/2/18 0:00     3    NGO/191217/17
110180  DC/NGO/050218/176   2/5/18 0:00     50   NGO/191217/17
110181  DC/NGO/050218/177   2/5/18 0:00     29   NGO/191217/17
110182  DC/NGO/050218/177   2/5/18 0:00     24   NGO/191217/17
110183  DC/NGO/060218/105   2/6/18 0:00     56   NGO/191217/17

我的可能输出表应该是这样的

DAY    DC_DATE      NOB   ME
1    1/27/18 0:00   800   800
1    1/27/18 0:00   400   400
1    1/27/18 0:00   600   600
1    1/27/18 0:00   700   700
1    1/27/18 0:00   720   720
3    1/29/18 0:00   700   2100
3    1/29/18 0:00   500   1500
4    1/30/18 0:00   834   3336
4    1/30/18 0:00   600   2400
4    1/30/18 0:00   10    40
7    2/2/18 0:00    900   6300
7    2/2/18 0:00    3     21
10   2/5/18 0:00    50    500
10   2/5/18 0:00    29    290
10   2/5/18 0:00    24    240
11   2/6/18 0:00    56    616
           TOTAL   6926  20563

我想为第一个dc_date分配值应该是1xNOB(1x800 = 800),第二个dc_date应该是3xNOB(3x700 = 2100),第三个dc_date应该是4xNOB(4x834 = 3336),依此类推到表的末尾。

如果更改dc_date,则DAY值应为,第二个日期 - 第一个日期+ 1(例如29.01.18-27.01.18 = 2 + 1 = 3),然后是第三个日期 - 第一个日期+ 1(例如30.01。 18-27.01.18 = 3 + 1 = 4)这个过程一直持续到表的末尾

**第一个(MIN)日期是基准日期,始终为1,并在两个日期之间减去后加上此值(例如29.01-27.01 = 2 + 1,30.01-27.01 = 3 + 1,0.02.02-27.01 = 6 + 1,05.02-27.01 = 9 + 1,06.02-27.01 = 10 + 1)

我通过查询所需的输出是" Total ME" = 20563和"平均ME" = 2.969(ME / NOB),用于上述基表。

我不想更新基表。请使用CTE查询。

分组依据应该在DC_DATE和TAG_NO。当TAG_NO改变时,DAY值应该再次从头开始。 NOB字段应该相加。

我正在使用sql server 2012

1 个答案:

答案 0 :(得分:0)

你可以试试这个。

SELECT  
    DATEDIFF(DAY, MIN(DC_DATE) OVER(PARTITION BY TAG_NO), DC_DATE) + 1 DAY
    , DC_DATE
    , NOB
    , (DATEDIFF(DAY, MIN(DC_DATE) OVER(PARTITION BY TAG_NO), DC_DATE) + 1) * NOB AS ME
FROM [MyTable]