是否可以使用查询中的列,检查其值并基于该值创建新列?

时间:2019-03-01 20:38:08

标签: 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 MinDate

假设我得到以下结果:

 Field1          MinDate
 17              10/02/2016
 29              03/02/2018

现在,如果在同一个查询中,我想创建一个新列,例如MinDate2,并更新上述结果集中的MinDate,我可以做类似的事情,例如是否要使用MinDate并做一些事情像:(基本上我想在上面的查询中添加它)

 , if MinDate = even year, then add 1 year, if MinDate is odd year then add 2 years

这样我的结果看起来像这样:

Field1          MinDate        MinDate2
17              10/02/2016     10/02/2017
29              03/02/2018     03/02/2020

这样可行吗?

之所以尝试这样做是因为我从80多个不同的列中提取了Min日期,因此,查询是一个庞然大物,我希望使其尽可能短(只要它能做我需要做的事情

3 个答案:

答案 0 :(得分:1)

您可以像这样使用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

在子查询中,它将如下所示:

  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

答案 1 :(得分: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年,如果YourValue%2的结果返回1则表示它为奇数,否则值为偶数

答案 2 :(得分:0)

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

这样,可以重新使用最小日期。

模数%可用于计算奇数+ 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