【问题标题】:TSQL - Return Records for each of the Months between Start and End Dates even if no data available for that monthTSQL - 返回开始日期和结束日期之间每个月的记录,即使该月没有可用数据
【发布时间】:2019-05-23 17:53:20
【问题描述】:

我目前的SELECT查询结果如下

SELECT Category, MonthYear, Percentage 
FROM #Result

@StartDate2018-12-01,@EndDate 为 2019-05-01

Category  | MonthYear  | Percentage
----------+------------+------------    
Category1 | 2018-12-01 | 80 
Category1 | 2019-01-01 | 70
Category1 | 2019-02-01 | 75
Category1 | 2019-03-01 | 60
Category1 | 2019-04-01 | 45
Category1 | 2019-05-01 | 29
Category2 | 2019-03-01 | 78
Category2 | 2019-04-01 | 95
Category2 | 2019-05-01 | 98

但我希望我的结果对于每个 Categories 都有介于 @StartDate@EndDate 之间的所有月份,如果该类别不存在数据,则百分比值为零。

Category  | MonthYear  | Percentage
----------+------------+------------    
Category1 | 2018-12-01 | 80 
Category1 | 2019-01-01 | 70
Category1 | 2019-02-01 | 75
Category1 | 2019-03-01 | 60
Category1 | 2019-04-01 | 45
Category1 | 2019-05-01 | 29
Category2 | 2018-12-01 | 0
Category2 | 2019-01-01 | 0
Category2 | 2019-02-01 | 0
Category2 | 2019-03-01 | 78
Category2 | 2019-04-01 | 95
Category2 | 2019-05-01 | 98

【问题讨论】:

标签: sql sql-server tsql


【解决方案1】:

您可以使用递归 CTE 来生成日期。然后使用cross joinleft join 来引入数据。所以:

with dates as (
      select min(monthyear) as yyyymm, max(monthyear) as max_yyyymm
      from t
      union all
      select dateadd(month, 1, yyyymm), max_yyyymm
      from dates
      where yyyymm < max_yyyymm
    )
select c.category, d.yyyymm, coalesce(t.percentage, 0) as percentage
from (select distinct category from t) c cross join
     dates d left join
     t
     on t.category = c.category and t.monthyear = d.yyyymm
order by c.category, d.yyyymm;

【讨论】:

  • @AdnanSharif 为什么? COALESCE() 是 ANSI 标准,而 ISNULL() 既是专有的,又与另一种 Microsoft 语言的 a differently-working function 混淆了一个名称。
  • 完美@gordon-linoff,这就是我要找的。谢谢!
  • 对谁更易读?似乎很主观。更合适?为什么?除了“我更喜欢它”之外,您能否具体说明为什么 ISNULL “更合适”?
  • @AdnanSharif 。 . .我在答案中写了COALESCE()。它比ISNULL() 更灵活(因为它接受多个参数并且是标准的)。您想特别在性能问题时使用ISNULL(),即第一个参数是非常复杂的表达式,例如子查询或复杂函数)。
  • @Adnan 我只知道一个案例,无论如何这是一个糟糕的模式。还有其他细微差别,但在大多数情况下,在标准的二选一方案中,它们是可以互换的。 COALESCE 与 ISNULL 相比还有其他优势,因此,除了一个非常特殊的边缘情况之外,COALESCE 将是一个更好的选择。 mssqltips.com/sqlservertip/2689/…
猜你喜欢
  • 2012-05-31
  • 1970-01-01
  • 1970-01-01
  • 2020-12-17
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2020-01-05
  • 2022-12-10
相关资源
最近更新 更多