我正在研究 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/