基于另一列中的值替换列的值的SQL查询
我在SQL Server中有一个表,它的数据如下:基于另一列中的值替换列的值的SQL查询,sql,sql-server,Sql,Sql Server,我在SQL Server中有一个表,它的数据如下: Costing_ID CostingName CostingNumber CostingNumberSuffix StartDate 1 Test 1234 2014-04-01 2 Test 2 1234 AA 2014-04-06 3 Test 3
Costing_ID CostingName CostingNumber CostingNumberSuffix StartDate
1 Test 1234 2014-04-01
2 Test 2 1234 AA 2014-04-06
3 Test 3 5668 2014-04-09
4 Test 4 1234 AB 2014-04-14
我需要生成一个返回所有行的视图,但将CostingNumberSuffix不为空的项目的StartDate替换为相应CostingNumber的StartDate,该StartDate为空
WITH CTE AS
(
SELECT CostingNumber, StartDate
FROM <tablename>
WHERE CostingNumberSuffix IS NULL
)
SELECT
T.Costing_ID,
T.CostingName,
T.CostingNumber,
T.CostingNumberSuffix,
ISNULL(CTE.StartDate, T.StartDate) AS StartDate
FROM <tablename> T
LEFT OUTER JOIN CTE
ON T.CostingNumber = CTE.CostingNumber
因此,我的查询应返回以下内容:
Costing_ID CostingName CostingNumber CostingNumberSuffix StartDate
1 Test 1234 2014-04-01
2 Test 2 1234 AA 2014-04-01
3 Test 3 5668 2014-04-09
4 Test 4 1234 AB 2014-04-01
我该怎么做呢 请尝试此查询。我还没有测试过,但你知道了:
SELECT
Costing_ID,
CostingName,
CostingNumber,
CostingNumberSuffix,
CASE
WHEN CostingNumberSuffix != ''
THEN (SELECT s.StartDate FROM table s WHERE s.CostingNumber = t.CostNumber and s.CostNumberSuffix = '')
ELSE
StartDate
END
FROM table t
以下是一个SQL查询,用于根据列中的值替换另一列中的值:
select t1.Costing_ID, t1.CostingName, t1.CostingNumber,
t1.CostingNumberSuffix,
coalesce (t2.StartDate, t1.StartDate)
from <table name> t1
left join (select * from <table name> where CostingNumberSuffix = '') t2
on t1.costingnumber = t2.costingnumber
SQL Server 2012:
select Costing_ID, CostingName, CostingNumber, CostingNumberSuffix,
first_value(StartDate) over (partition by CostingNumber order by CostingNumberSuffix
rows unbounded preceding) as StartDate
from Costing
order by Costing_ID
此解决方案使用公共表表达式a.k.a CTE。CTE查找CostingNumberSuffix为空的项目的起始日期
WITH CTE AS
(
SELECT CostingNumber, StartDate
FROM <tablename>
WHERE CostingNumberSuffix IS NULL
)
SELECT
T.Costing_ID,
T.CostingName,
T.CostingNumber,
T.CostingNumberSuffix,
ISNULL(CTE.StartDate, T.StartDate) AS StartDate
FROM <tablename> T
LEFT OUTER JOIN CTE
ON T.CostingNumber = CTE.CostingNumber
测试3的日期是什么?测试3有自己的成本编号,没有后缀,所以它会保留起始日期。如果我有一个成本编号为5668、后缀为ZZ的测试6,它将获得测试3的起始日期等。每个成本编号上只有一个没有后缀的记录。