34,587
社区成员
发帖
与我相关
我的任务
分享
2016-9 0
2016-10 0
2016-11 100000.00
2017-01 0
2017-02 0
2017-03 0
2017-04 0
2017-05 6406.85
2017-06 196854.20
2017-07 1175842.28
2017-08 419287.10
2017-09 767780.14
USE tempdb
GO
--测试数据
if not object_id(N'T') is null
drop table T
Go
Create table T([adate] nvarchar(27),[avalue] decimal(18,2))
Insert T
--select N'2016-9',null union all
--select N'2016-10',null union all
select N'2016-11',100000.00 union all
--select N'2017-01',null union all
--select N'2017-02',null union all
--select N'2017-03',null union all
select N'2017-04',0 union all
select N'2017-05',6406.85 union all
select N'2017-06',196854.20 union all
select N'2017-07',1175842.28 union all
select N'2017-08',419287.10 union all
select N'2017-09',767780.14
GO
SELECT t2.d,ISNULL(t.avalue,0) AS avalue
FROM (
--生成 2016-09 到 2017-09 的所有月份,这是关键了
SELECT CONVERT(CHAR(7),DATEADD(MONTH,sv.number,'2016-09-01'),120) AS d
FROM MASTER.dbo.spt_values AS sv WHERE sv.type='p' AND sv.number BETWEEN 0 AND 12
) AS t2 LEFT JOIN T ON t2.d=t.adate
/*
d avalue
2016-09 0.00
2016-10 0.00
2016-11 100000.00
2016-12 0.00
2017-01 0.00
2017-02 0.00
2017-03 0.00
2017-04 0.00
2017-05 6406.85
2017-06 196854.20
2017-07 1175842.28
2017-08 419287.10
2017-09 767780.14
*/
if object_id('tempdb..#Tmp_Data') is not null
drop table #Tmp_Data
CREATE TABLE #Tmp_Data (
my_date Datetime,
my_Amount Decimal(13,2))
INSERT INTO #Tmp_Data
Select '2016-11-05',100000.00 union
Select '2017-05-11',6406.85 union
Select '2017-06-20',196854.20 union
Select '2017-07-15',1175842.28 union
Select '2017-08-11',419287.10 union
Select '2017-09-25',767780.14
Select (cast(year(a.My_Date) as varchar)+'-'+cast(month(a.my_date) as varchar)) as my_date,
my_Amount
From (
Select DateAdd(MONTH,sv.number,DateAdd(Year,-1,getdate())) as my_Date
FROM master.dbo.spt_values AS sv
WHERE sv.type='P' AND sv.number BETWEEN 1 AND 12
) a
Left Join #Tmp_Data b on year(a.my_date)=year(b.my_date) and month(a.my_date)=month(b.my_Date)
select dateadd(mm,-1,getdate()),419287.10 union all
就是类似这样的,谢谢了大佬UPDATE 表名 SET avalue=0 WHERE avalue IS NULL
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([adate] nvarchar(27),[avalue] decimal(18,8))
Insert #T
select N'2016-9',null union all
select N'2016-10',null union all
select N'2016-11',100000.00 union all
select N'2017-01',null union all
select N'2017-02',null union all
select N'2017-03',null union all
select N'2017-04',0 union all
select N'2017-05',6406.85 union all
select N'2017-06',196854.20 union all
select N'2017-07',1175842.28 union all
select N'2017-08',419287.10 union all
select N'2017-09',767780.14
Go
--测试数据结束
UPDATE #T SET avalue=0 WHERE avalue IS NULL
SELECT * FROM #T
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([adate] nvarchar(27),[avalue] decimal(18,8))
Insert #T
select N'2016-9',null union all
select N'2016-10',null union all
select N'2016-11',100000.00 union all
select N'2017-01',null union all
select N'2017-02',null union all
select N'2017-03',null union all
select N'2017-04',0 union all
select N'2017-05',6406.85 union all
select N'2017-06',196854.20 union all
select N'2017-07',1175842.28 union all
select N'2017-08',419287.10 union all
select N'2017-09',767780.14
Go
--测试数据结束
Select adate,ISNULL(avalue,0) AS avalue from #T
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([adate] nvarchar(27),[avalue] decimal(18,8))
Insert #T
select N'2016-09',15000 union all
select N'2016-11',100000.00 union all
select N'2017-05',6406.85 union all
select N'2017-06',196854.20 union all
select N'2017-07',1175842.28 union all
select N'2017-09',767780.14
GO
--测试数据结束
DECLARE @maxdate DATE,
@mindate DATE
SELECT @maxdate = MAX(CAST([adate] + '-01' AS DATE)),
@mindate = MIN(CAST([adate] + '-01' AS DATE))
FROM #t;
WITH cte AS(
SELECT DATEADD(MONTH, number, @mindate) AS [adate]
FROM MASTER..spt_values
WHERE TYPE = 'P'
AND DATEADD(MONTH, number, @mindate) <= @maxdate
)
SELECT LEFT(a.[adate], 7) AS adate,
ISNULL(b.avalue, 0) AS avalue
FROM cte a
LEFT OUTER JOIN #t b
ON CAST(b.[adate] + '-01' AS DATE) = a.[adate]
----------------------------------------------------------------------------------------------
adate avalue
-------------- ---------------------------------------
2016-09 15000.00000000
2016-10 0.00000000
2016-11 100000.00000000
2016-12 0.00000000
2017-01 0.00000000
2017-02 0.00000000
2017-03 0.00000000
2017-04 0.00000000
2017-05 6406.85000000
2017-06 196854.20000000
2017-07 1175842.28000000
2017-08 0.00000000
2017-09 767780.14000000
(13 行受影响)
以上方案解决了数据中没有这个月份自动填充的功能