首页 > 解决方案 > 在不使用联合表或临时表的情况下合并两个查询的输出

问题描述

我有下表 IDValues

ID 唯一身份 排序 开始日期 结束日期 改变了 价值
501 23 2 2011-01-14 2011-12-19 0 664
302 15 9 2021-03-05 2021-04-27 0 223
351 31 6 2017-08-18 2017-10-16 0 765
501 27 3 2011-12-20 2012-01-15 1 416
501 19 1 2010-12-29 2011-01-03 0 519
351 26 3 2016-01-19 2016-03-11 0 364
501 21 4 2012-01-16 2012-05-15 1 447
302 14 10 2021-04-28 2021-05-15 1 776
413 41 5 2018-08-20 2018-12-11 0 679
455 41 7 2017-11-23 2018-01-25 1 456

我需要找到 Changed=1 和 Sort Order=x 的 ID 及其详细信息,以及 Sort Order=x-1 的 ID,即具有先前排序顺序的 ID(如果存在)。

同样对于排序顺序 = x 的 ID,我必须找到天数 = 从 StartDate 到月底的天数 对于排序顺序 = x-1 的 ID,我必须找到天数 = 数量从月初到 EndDate 的天数。

我尝试分两部分进行,并使用临时表并结合两个结果。

Select *, DATEDIFF(d,StartDate,eomonth(StartDate)) as NoOfDays
into #temptbl
from IDDetails where Changed=1

Select A.*, day(EndDate) as NoOfDays from IDDetails A inner join #temptbl B
on A.ID=B.ID and A.SortOrder= B.SortOrder-1

当我结合这些结果时,我得到了想要的输出。但我不想使用临时表或联合函数。下面是我需要的输出。有没有其他方法可以在不编写两个查询的情况下获得输出?

输出:

ID 唯一身份 排序 开始日期 结束日期 改变了 价值 天数
501 23 2 2011-01-14 2011-12-19 0 664 19
302 15 9 2021-03-05 2021-04-27 0 223 27
501 27 3 2011-12-20 2012-01-15 1 416 12
501 21 4 2012-01-16 2012-05-15 1 447 16
302 14 10 2021-04-28 2021-05-15 1 776 3
501 27 3 2011-12-20 2012-01-15 1 416 15
455 41 7 2017-11-23 2018-01-25 1 456 25

标签: sqlsql-server

解决方案


最直接的选择就是使用嵌套查询。获取您的第一个查询并将其嵌套在您的第二个查询中......

Select
  A.*, day(EndDate) as NoOfDays
from
  IDDetails A
inner join
(
  Select
    *,
    DATEDIFF(d,StartDate,eomonth(StartDate)) as NoOfDays
  from
    IDDetails
  where
    Changed = 1
)
  B
    on  A.ID        = B.ID
    and A.SortOrder = B.SortOrder - 1

这本身可以进一步简化为一个简单的自连接......

SELECT
  A.*, day(EndDate) as NoOfDays
FROM
  IDDetails A
INNER JOIN
  IDDetails B
    on  A.ID        = B.ID
    and A.SortOrder = B.SortOrder - 1
WHERE
  B.Changed = 1

笔记:

  • day(EndDate)在所有情况下都是模棱两可的;两者都有A,指定或BEndDateA.EndDateB.EndDate
  • 您在 中创建 NoOfDaysB,然后不要在第二个查询中使用它

推荐阅读