Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于另一列中的值替换列的值的SQL查询_Sql_Sql Server - Fatal编程技术网

基于另一列中的值替换列的值的SQL查询

基于另一列中的值替换列的值的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

我在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      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的起始日期等。每个成本编号上只有一个没有后缀的记录。