【发布时间】:2021-05-27 10:46:05
【问题描述】:
我有下表 IDValues
| ID | Unique ID | Sort Order | Start Date | End Date | Changed | Value |
|---|---|---|---|---|---|---|
| 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 | Unique ID | Sort Order | Start Date | End Date | Changed | Value | No. of days |
|---|---|---|---|---|---|---|---|
| 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 |
【问题讨论】:
-
您使用的是
MySQL还是SQL-Server? -
@apanda 。 . .根据查询的语法,我假设您使用的是 SQL Server,所以我删除了 MySQL 标记。
-
您可以使用 CTE 而不是临时表。另外,为什么不使用临时表?
-
@MarkoIvkovic 我正在使用 SQL-Server。我的错误是我添加了 MySQL 标签。
标签: sql sql-server