【发布时间】:2013-11-07 08:55:31
【问题描述】:
我有一个包含以下列的表格:
Document_ID, Customer_ID, Date, LoanedMoney.
我创建了一个新的LoanedDate 列。我想通过以下方式将日期填写到LoanedDate:
- 如果之前的
Date或之前的日期不存在(它并不意味着总是-1 天)且具有相同的Document_ID和Customer_ID为空-> 复制LoanedMoney值并使用该值更新价值; - 如果之前的
Date(并不总是-1 天)与相同的Document_ID和Customer_ID不为空-> 复制它并使用该值更新; - 否则将
NULL设置为LoanedDate
我判断前一个Date的大概逻辑(不知道case语句怎么写):
SELECT TOP 1 Z1.Date
FROM DBANME Z1
LEFT JOIN DBNAME Z2
ON Z1.Document_ID = Z2.Document_ID AND Z1.Customer_ID = Z2.Customer_ID AND CONVERT(CHAR(8), Z1.Date, 112) < CONVERT(CHAR(8), Z2.Date, 112)
ORDER BY Date DESC
我做过这样的事情:
DECLARE @Min datetime, @Prev datetime
SELECT @Min = MIN(Date) FROM DBNAME
UPDATE DBNAME
SET LoanedDate CASE
WHEN (LoanedMoney > 0)
-- SET @Prev =
CASE WHEN @Prev IS NULL THEN Date
ELSE @Prev
ELSE NULL
实现它的最佳方式是什么?
我有什么:
Document_ID, Customer_ID, Date, LoanedMoney, LoanedDate
1, 1, 2012-04-30, 30, NULL
1, 1, 2012-04-29, 50, NULL
1, 1, 2012-04-28, 50, NULL
1, 1, 2012-04-27, 0, NULL
1, 1, 2012-04-26, 20, NULL
我的期望:
Document_ID, Customer_ID, Date, LoanedMoney, LoanedDate
1, 1, 2012-04-30, 30, 2012-04-28
1, 1, 2012-04-29, 50, 2012-04-28
1, 1, 2012-04-28, 50, 2012-04-28
1, 1, 2012-04-27, 0, NULL -- Because LoanedMoney = 0
1, 1, 2012-04-26, 20, 2012-04-26
【问题讨论】:
-
您能否在您的问题中添加几行示例数据和预期结果?
-
请更新您的问题。不要在cmets中写额外的数据,这样太不可读了。
-
对不起,完成。请看上面。
-
如何在
Date = 2012-04-30的第一行获得LoanedDate = 2012-04-28?从前面的解释中我真的无法理解。 -
因为
LoanedMoney > 0自 2012 年 4 月 28 日起。
标签: sql sql-server sql-update case