SQL - 将以前的Application的值传递到下一个Application

时间:2016-05-13 09:34:48

标签: sql-server

我在SQL server中有一个表,返回下面的结果,我在将SQNCarriedOver值转移到下一个应用程序的ThisAppOFFICIAL列时遇到问题。

我无法根据行号执行此操作,因为项目名称未按此顺序列出:

enter image description here

我想知道是否有办法将QSNCarried值超过下一个具有该项目名称的应用程序中的ThisAppOFFICIAL列,

所以例如: “12/06/2016”的thisAppOfficial值为“10”(来自“2016年12月12日”的QSCarriedOver)

我可能忽视了一些事情,我在网上搜索过,但我觉得我的问题非常具体。

感谢任何帮助或建议,谢谢你。

PS: 下一个申请是具有相同项目名称的下一个申请日期

2 个答案:

答案 0 :(得分:2)

查询:

<强> SQLFIDDLEExample

SELECT t.Project,
       t.AppDate,
       t.thisAppOfficial,
       COALESCE((SELECT TOP 1 t2.QSCarriedOver
        FROM X t2
        WHERE t2.Project = t.Project
        AND t2.AppDate < t.AppDate
        ORDER BY t2.AppDate desc), 0) as NewColumn,
       t.QSCarriedOver
FROM X t

结果:

| Project |    AppDate | thisAppOfficial | NewColumn | QSCarriedOver |
|---------|------------|-----------------|-----------|---------------|
|       A | 2016-04-13 |              30 |         0 |             0 |
|       A | 2016-05-12 |              30 |         0 |            10 |
|       A | 2016-06-12 |              30 |        10 |             0 |
|       A | 2016-07-12 |              30 |         0 |             0 |

答案 1 :(得分:1)

我想我已经得到了你想要的东西,我确信有更好的方法。我根据自己的需要创建了一个更简单的表格版本。然后我使用ROW_NUMBER将行放入一个序列中,这样我就可以对前一行进行一种自连接以获得结转数字

CREATE TABLE X (Project varchar(50), AppDate  date, thisAppOfficial int, QSCarriedOver int)
inserT INTO X VALUES('A', '13 Apr 2016', 30,0)
inserT INTO X VALUES('A', '12 May 2016', 30,10)
inserT INTO X VALUES('A', '12 Jun 2016', 30,0)
inserT INTO X VALUES('A', '12 Jul 2016', 30,0)

SELECT X0.Project, X0.AppDate, X0.thisAppOfficial, X0.QSCarriedOver, ISNULL(X2.QSCarriedOver,0) as 'Brought forward from previous row'  FROM X X0
JOIN (select ROW_NUMBER () OVER (ORDER BY Project, AppDate) as MainRow, * from X) X1 ON X1.Project = X0.Project AND X1.AppDate = X0.AppDate
LEFT OUTER JOIN (select ROW_NUMBER () OVER (ORDER BY Project, AppDate) as PrevRow, * FROM X) X2 ON X2.Project = X1.Project and X2.PrevRow = MainRow -1
order by Project, AppDate

尝试一下,看看它是否正在做你需要的东西,我不是百分之百确定我已经理解了你的要求所以没有问题,如果它不是你想要的。