sql - 填充日期查询中缺失的月份

标签 sql sql-server

我正在研究 Microsoft SQL Server 2017。 我正在尝试填补数据查询中缺失的月份。

查询是:

SELECT Concat(Datename(mm, temp1.InvoiceDate), '-', Datepart(yy, Getdate())) AS 'Date' , temp1.[Partner], Count(temp1.issues) AS 'Total' 
FROM   temp1 
GROUP  BY temp1.InvoiceDate, temp1.[partner] 
ORDER  BY Datepart(mm, temp1.InvoiceDate), temp1.[partner];

不要介意 getdate,因为我将始终处理实际年份数据。

它向我展示了结果:

Date        Partner             Total
April-2020  Enterprise1, S.A.   1
May-2020    Enterprise2, S.A.   1
July-2020   Enterprise2, S.A.   2

这是正确的,但我也需要缺失的月份,直到实际月份(getdate 实际月份)为止,其中没有数据。

类似于:

Date           Partner           Total
January-2020   N/A                0
February-2020  N/A                0
March-2020     N/A                0
April-2020     Enterprise1, S.A.  1
May-2020       Enterprise2, S.A.  1
June-2020      N/A                0
July-2020      Enterprise2, S.A.  2
August-2020    N/A                0
September-2020 N/A                0

此外,我不希望显示实际月份的月份。

PS:我无法在我的开发环境中使用T-SQL代码(声明等)。

提前致谢。

最佳答案

我将使用递归 CTE 来生成当年的日期:

with dates as (
      select datefromparts(year(getdate()), 1, 1) as yyyymm
      union all
      select dateadd(month, 1, yyyymm)
      from dates
      where yyyymm < getdate()
     )
select d.yyyymm, t1.partner, count(t1.issues)
from dates d left join
     temp1 t1 
     ON t1.InvoiceDate >= d.yyyymm AND
        t1.InvoiceDate < dateadd(month, 1, d.yyyymm)
group by d.yyyymm, t1.partner
order by d.yyyymm, t1.partner;

注意一些变化:

  • 这将返回日期。它不会像您那样格式化它。您可以按照自己喜欢的方式设置其格式。
  • 它返回0而不是“N/A”。 0 似乎更合适。

上述内容实际上仅适用于一个合作伙伴(因此它适用于问题中的示例)。我怀疑你想要所有合作伙伴的所有月份。如果是这样,请使用交叉联接生成行,然后使用左联接分组依据:

with dates as (
      select datefromparts(year(getdate()), 1, 1) as yyyymm
      union all
      select dateadd(month, 1, yyyymm)
      from dates
      where yyyymm < getdate()
     )
select d.yyyymm, p.partner, count(t1.issues)
from dates d cross join
     (select distinct partner from temp1) p left join
     temp1 t1 
     on t1.partner = p.partner and
        t1.InvoiceDate >= d.yyyymm and
        t1.InvoiceDate < dateadd(month, 1, d.yyyymm)
group by d.yyyymm, p.partner
order by d.yyyymm, p.partner;

关于sql - 填充日期查询中缺失的月份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63919706/

相关文章:

sql - 如何为SQL Server中的列添加标识?

sql - 在 sql join 中不包括空值

sql-server - 具有挑战性的递归 T-SQL 查询

python - 如何更新表格所有行中的列?

sql-server - 如何从 Azure VM 上的 SQL Server Blob 存储中删除数据磁盘

java - 使用 servlet 和 jsp 显示表格时出现问题

sql - 修改元组值的 MYSQL Select 语句

mysql - 从 MySql 查询 SQL Server 数据库?

java - 使用不同的基线来查询数据

sql - 找不到 SKU 时返回 0 数量