sql - 在不使用联合表或临时表的情况下合并两个查询的输出
问题描述
我有下表 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 |
解决方案
最直接的选择就是使用嵌套查询。获取您的第一个查询并将其嵌套在您的第二个查询中......
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
,指定或B
EndDate
A.EndDate
B.EndDate
- 您在 中创建
NoOfDays
列B
,然后不要在第二个查询中使用它
推荐阅读
- javascript - Javascript 整个 div 链接 WITH target="_blank"
- sql-server - SQL Server 2017 最低要求的本地实例
- android - 在android中使用接口扩展一个具有多个活动的类
- html - 外部 div 在里面修改时搞砸了
- amazon-web-services - 我可以垂直扩展 Amazon 实例吗?
- c# - .NET Core 2.1 基于 .NET 套接字和 Span 的新 HttpClient
. 好像有问题 - regex - 如何用显式“\n”替换单元格中的换行符?
- python - 如何改进解析 lz4 压缩 json 的方法?
- java - Java Stream 有状态 findFirst
- ruby-on-rails - 无法通过多对多关联查询父级 - Rails