我希望我的标题不要太混乱,我基本上有一个看起来像这样的查询:
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日期,因此,查询是一个庞然大物,我希望使其尽可能短(只要它能做我需要做的事情
答案 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