我在SQL server中有一个表,返回下面的结果,我在将SQNCarriedOver值转移到下一个应用程序的ThisAppOFFICIAL列时遇到问题。
我无法根据行号执行此操作,因为项目名称未按此顺序列出:
我想知道是否有办法将QSNCarried值超过下一个具有该项目名称的应用程序中的ThisAppOFFICIAL列,
所以例如: “12/06/2016”的thisAppOfficial值为“10”(来自“2016年12月12日”的QSCarriedOver)
我可能忽视了一些事情,我在网上搜索过,但我觉得我的问题非常具体。
感谢任何帮助或建议,谢谢你。
PS: 下一个申请是具有相同项目名称的下一个申请日期
答案 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
尝试一下,看看它是否正在做你需要的东西,我不是百分之百确定我已经理解了你的要求所以没有问题,如果它不是你想要的。