Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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,我希望我的标题不要太混乱,我基本上有一个类似这样的查询: Select tblA.Field1, convert(Varcharr(10), Select Min(f) from ( values (tblA.Date1), (tblA.Date2), (tblA.Date3) ) As Fields(f) ), 101) as

我希望我的标题不要太混乱,我基本上有一个类似这样的查询:

Select tblA.Field1, convert(Varcharr(10),
    Select Min(f) from (
                      values (tblA.Date1),
                             (tblA.Date2),
                             (tblA.Date3) ) As Fields(f) ), 101) as MinDate
假设我得到以下结果:

 Field1          MinDate
 17              10/02/2016
 29              03/02/2018
现在,如果在同一个查询中,我想创建一个新列,比如MinDate2,并在上面的结果集中更新MinDate,我可以这样做吗,比如说,如果我想获取MinDate并这样做:(基本上我想在上面的查询中添加这个)

因此,我的结果如下所示:

Field1          MinDate        MinDate2
17              10/02/2016     10/02/2017
29              03/02/2018     03/02/2020
  SELECT Your_Value,
         Your_Value + 5 AS New_Value
    FROM (SELECT YT.SomeField1 = YT.SomeField2 AS Your_Value
            FROM Your_Table
         ) INTERIM_RESULT
这样做可行吗


我之所以尝试这样做,是因为我从80多个不同的列中提取Min-date,因此,查询是一个怪物,我希望它尽可能短(只要它做我需要它做的事情)

您可以使用这样的SQL来重用计算表达式。子查询也可以工作,它更像是一个首选项调用

WITH INTERIM_RESULT AS
  ( SELECT YT.SomeField1 + YT.SomeField2 Your_Value
      FROM Your_Table YT
  )
  SELECT Your_Value + 5 AS New_Value
    FROM INTERIM_RESULT
在子查询中,它将如下所示:

Field1          MinDate        MinDate2
17              10/02/2016     10/02/2017
29              03/02/2018     03/02/2020
  SELECT Your_Value,
         Your_Value + 5 AS New_Value
    FROM (SELECT YT.SomeField1 = YT.SomeField2 AS Your_Value
            FROM Your_Table
         ) INTERIM_RESULT
关于您在评论中的示例:

      SELECT Field1,
             Field2,
             Case When Field2 = 1 then 'Hey' 
                  Else 'Bye' 
              END as Field3
        FROM ( SELECT Field1,
                      Something AS Field2
                 FROM SOME_TABLE
             ) TMP

您可以像这样使用SQL来重用计算表达式。子查询也可以工作,它更像是一个首选项调用

WITH INTERIM_RESULT AS
  ( SELECT YT.SomeField1 + YT.SomeField2 Your_Value
      FROM Your_Table YT
  )
  SELECT Your_Value + 5 AS New_Value
    FROM INTERIM_RESULT
在子查询中,它将如下所示:

Field1          MinDate        MinDate2
17              10/02/2016     10/02/2017
29              03/02/2018     03/02/2020
  SELECT Your_Value,
         Your_Value + 5 AS New_Value
    FROM (SELECT YT.SomeField1 = YT.SomeField2 AS Your_Value
            FROM Your_Table
         ) INTERIM_RESULT
关于您在评论中的示例:

      SELECT Field1,
             Field2,
             Case When Field2 = 1 then 'Hey' 
                  Else 'Bye' 
              END as Field3
        FROM ( SELECT Field1,
                      Something AS Field2
                 FROM SOME_TABLE
             ) TMP
示例(不确定您是否希望从顶部查询或数据子集执行此操作),并且您的查询中似乎没有实际的表结构,因此示例可以执行此操作,您可以将其转换为代码:

DECLARE @DateColumn AS DATETIME = GETDATE()

-- the %2 does a check and if 0 is returned it is even, otherwise null and the case statement does the dateadd for you 
SELECT @DateColumn, CASE WHEN YEAR(@DateColumn) % 2 = 0 THEN DATEADD(yy, 1, @DateColumn) ELSE DATEADD(yy, 2, @DateColumn) END
这以DateColumn year为例,如果值%2的结果返回1,则表示为奇数,否则值为偶数(不确定是从顶部查询还是从数据子集执行此操作)而且您的查询中似乎没有实际的表结构,因此可以举一个例子来说明,您可以将其转换为代码中的表结构:

DECLARE @DateColumn AS DATETIME = GETDATE()

-- the %2 does a check and if 0 is returned it is even, otherwise null and the case statement does the dateadd for you 
SELECT @DateColumn, CASE WHEN YEAR(@DateColumn) % 2 = 0 THEN DATEADD(yy, 1, @DateColumn) ELSE DATEADD(yy, 2, @DateColumn) END

这需要DateColumn year,如果您的值%2的结果返回1,则表示它为奇数,否则值为偶数

在这里交叉应用可能很方便

这样就可以重复使用最短日期

模数
%
可用于计算奇数+2年和偶数+1年

样本数据:

-- Temporary test table
create table #tblTest (Field1 int, Date1 date, Date2 date, Date3 date);

-- Sample data
insert into #tblTest (Field1, Date1, Date2, Date3) values
(17, '2016-02-20', '2016-02-10', '2016-02-15'),
(29, '2017-02-15', '2017-02-09', '2017-02-03');
SELECT 
 t.Field1,
 CONVERT(VARCHAR(10), ca.MinDate, 101) as MinDate,
 CONVERT(VARCHAR(10), DATEADD(year, 1+YEAR(ca.MinDate)%2, ca.MinDate), 101) as MinDate2
FROM #tblTest t
CROSS APPLY (
  SELECT MIN(v.dt) as MinDate
  FROM (VALUES
      (t.Date1), (t.Date2), (t.Date3)
   ) As v(dt)
) ca;
Field1  MinDate     MinDate2
17      02/10/2016  02/10/2017
29      02/03/2017  02/03/2019
查询:

-- Temporary test table
create table #tblTest (Field1 int, Date1 date, Date2 date, Date3 date);

-- Sample data
insert into #tblTest (Field1, Date1, Date2, Date3) values
(17, '2016-02-20', '2016-02-10', '2016-02-15'),
(29, '2017-02-15', '2017-02-09', '2017-02-03');
SELECT 
 t.Field1,
 CONVERT(VARCHAR(10), ca.MinDate, 101) as MinDate,
 CONVERT(VARCHAR(10), DATEADD(year, 1+YEAR(ca.MinDate)%2, ca.MinDate), 101) as MinDate2
FROM #tblTest t
CROSS APPLY (
  SELECT MIN(v.dt) as MinDate
  FROM (VALUES
      (t.Date1), (t.Date2), (t.Date3)
   ) As v(dt)
) ca;
Field1  MinDate     MinDate2
17      02/10/2016  02/10/2017
29      02/03/2017  02/03/2019
结果:

-- Temporary test table
create table #tblTest (Field1 int, Date1 date, Date2 date, Date3 date);

-- Sample data
insert into #tblTest (Field1, Date1, Date2, Date3) values
(17, '2016-02-20', '2016-02-10', '2016-02-15'),
(29, '2017-02-15', '2017-02-09', '2017-02-03');
SELECT 
 t.Field1,
 CONVERT(VARCHAR(10), ca.MinDate, 101) as MinDate,
 CONVERT(VARCHAR(10), DATEADD(year, 1+YEAR(ca.MinDate)%2, ca.MinDate), 101) as MinDate2
FROM #tblTest t
CROSS APPLY (
  SELECT MIN(v.dt) as MinDate
  FROM (VALUES
      (t.Date1), (t.Date2), (t.Date3)
   ) As v(dt)
) ca;
Field1  MinDate     MinDate2
17      02/10/2016  02/10/2017
29      02/03/2017  02/03/2019

交叉申请在这里可能很方便

这样就可以重复使用最短日期

模数
%
可用于计算奇数+2年和偶数+1年

样本数据:

-- Temporary test table
create table #tblTest (Field1 int, Date1 date, Date2 date, Date3 date);

-- Sample data
insert into #tblTest (Field1, Date1, Date2, Date3) values
(17, '2016-02-20', '2016-02-10', '2016-02-15'),
(29, '2017-02-15', '2017-02-09', '2017-02-03');
SELECT 
 t.Field1,
 CONVERT(VARCHAR(10), ca.MinDate, 101) as MinDate,
 CONVERT(VARCHAR(10), DATEADD(year, 1+YEAR(ca.MinDate)%2, ca.MinDate), 101) as MinDate2
FROM #tblTest t
CROSS APPLY (
  SELECT MIN(v.dt) as MinDate
  FROM (VALUES
      (t.Date1), (t.Date2), (t.Date3)
   ) As v(dt)
) ca;
Field1  MinDate     MinDate2
17      02/10/2016  02/10/2017
29      02/03/2017  02/03/2019
查询:

-- Temporary test table
create table #tblTest (Field1 int, Date1 date, Date2 date, Date3 date);

-- Sample data
insert into #tblTest (Field1, Date1, Date2, Date3) values
(17, '2016-02-20', '2016-02-10', '2016-02-15'),
(29, '2017-02-15', '2017-02-09', '2017-02-03');
SELECT 
 t.Field1,
 CONVERT(VARCHAR(10), ca.MinDate, 101) as MinDate,
 CONVERT(VARCHAR(10), DATEADD(year, 1+YEAR(ca.MinDate)%2, ca.MinDate), 101) as MinDate2
FROM #tblTest t
CROSS APPLY (
  SELECT MIN(v.dt) as MinDate
  FROM (VALUES
      (t.Date1), (t.Date2), (t.Date3)
   ) As v(dt)
) ca;
Field1  MinDate     MinDate2
17      02/10/2016  02/10/2017
29      02/03/2017  02/03/2019
结果:

-- Temporary test table
create table #tblTest (Field1 int, Date1 date, Date2 date, Date3 date);

-- Sample data
insert into #tblTest (Field1, Date1, Date2, Date3) values
(17, '2016-02-20', '2016-02-10', '2016-02-15'),
(29, '2017-02-15', '2017-02-09', '2017-02-03');
SELECT 
 t.Field1,
 CONVERT(VARCHAR(10), ca.MinDate, 101) as MinDate,
 CONVERT(VARCHAR(10), DATEADD(year, 1+YEAR(ca.MinDate)%2, ca.MinDate), 101) as MinDate2
FROM #tblTest t
CROSS APPLY (
  SELECT MIN(v.dt) as MinDate
  FROM (VALUES
      (t.Date1), (t.Date2), (t.Date3)
   ) As v(dt)
) ca;
Field1  MinDate     MinDate2
17      02/10/2016  02/10/2017
29      02/03/2017  02/03/2019

当您说创建一个新列时,您是说只在查询结果中包含,还是在表结构中实际创建一个列?需要澄清,因为你说的是添加列和更新值。是的@Brad,将其与MinDate2一起包含在结果中。很抱歉,那些
Date1
等列存储为有效的日期数据类型?是的,这些是实际日期,另存为“datetime”字段类型当您说创建一个新列时,您是说只包含在查询结果中,还是在表结构中实际创建一个列?需要澄清,因为你说的是添加列和更新值。是的@Brad,将其与MinDate2一起包含在结果中。我的道歉是那些
Date1
,等等,存储为有效日期数据类型的列?是的,这些是实际日期,保存为“datetime”字段类型但我如何在子查询中使用MinDate,它告诉我MinDate是“无效列名”,我希望你知道我的意思,假设这是一个简化的示例:选择Field1,作为Field2,案例当(Field2=1,然后是'Hey'Else'Bye'END)作为Field3时,请检查编辑。这在SQLServer中更像是一个恼人的语法约束。你不能在同一个select子句中使用表达式别名,你需要一个CTE(with子句)或子查询形式的中间步骤。非常感谢。但是我如何在子查询中使用MinDate,它告诉我MinDate是“无效列名”我希望您知道我的意思,假设这是一个简化的示例:选择Field1,将某物作为Field2,将Case When(Field2=1,然后“Hey”或“Bye”END)作为Field3签出编辑。这在SQLServer中更像是一个恼人的语法约束。您不能在同一个select子句中使用表达式别名,您需要一个CTE(with子句)或子查询形式的中间步骤。非常感谢