22,300
社区成员




create table test(月份 nvarchar(20),数量 int,标题 nvarchar(10))
insert into test
select '2013-08',100,'测试' union all
select '2013-09',100,'测试' union all
select '2013-08',100,'测试1' union all
select '2014-04',100,'测试1' union all
select '2014-08',100,'测试1' union all
select '2013-08',100,'测试2'
求参数 @标题=‘测试’时 显示结果为
2013-01 null null 2014-01 null null
2013-02 null null 2014-02 null null
2013-03 null null 2014-03 null null
2013-04 null null 2014-04 null null
2013-05 null null 2014-05 null null
2013-06 null null 2014-06 null null
2013-07 null null 2014-07 null null
2013-08 100 '测试' 2014-08 null null
2013-09 100 '测试' 2014-09 null null
2013-10 null null 2014-10 null null
2013-11 null null 2014-11 null null
2013-12 null null 2014-12 null null
@标题=‘测试1’时 显示结果为
2013-01 null null 2014-01 null null
2013-02 null null 2014-02 null null
2013-03 null null 2014-03 null null
2013-04 null null 2014-04 100 '测试1'
2013-05 null null 2014-05 null null
2013-06 null null 2014-06 null null
2013-07 null null 2014-07 null null
2013-08 100 '测试1' 2014-08 100 '测试1'
2013-09 null null 2014-09 null null
2013-10 null null 2014-10 null null
2013-11 null null 2014-11 null null
2013-12 null null 2014-12 null null
@标题=‘测试5’时 显示结果为
2013-01 null null 2014-01 null null
2013-02 null null 2014-02 null null
2013-03 null null 2014-03 null null
2013-04 null null 2014-04 null null
2013-05 null null 2014-05 null null
2013-06 null null 2014-06 null null
2013-07 null null 2014-07 null null
2013-08 null null 2014-08 null null
2013-09 null null 2014-09 null null
2013-10 null null 2014-10 null null
2013-11 null null 2014-11 null null
2013-12 null null 2014-12 null null
DECLARE @i VARCHAR(10) = '测试5';
WITH TT
AS ( SELECT number
FROM master..spt_values
WHERE type = 'P'
AND number BETWEEN 0 AND 11
)
SELECT CONVERT(VARCHAR(7), A.dd, 120) AS dd ,
A.数量 ,
A.标题 ,
CONVERT(VARCHAR(7), ISNULL(B.dd,DATEADD(yy,1,A.dd)), 120) dd , --修正一下这里
B.数量 ,
B.标题
FROM ( SELECT DATEADD(mm, TT.number, '2013-01-01') AS dd ,
T.数量 ,
T.标题
FROM TT
LEFT JOIN test T ON CONVERT(VARCHAR(7), DATEADD(mm,
TT.number,
'2013-01-01'), 120) = T.月份
WHERE T.标题 = @i
OR T.标题 IS NULL
) A
left JOIN ( SELECT DATEADD(mm, TT.number, '2014-01-01') AS dd ,
T1.数量 ,
T1.标题
FROM TT
LEFT JOIN test T1 ON CONVERT(VARCHAR(7), DATEADD(mm,
TT.number,
'2014-01-01'), 120) = T1.月份
WHERE T1.标题 = @i
OR T1.标题 IS NULL
) B ON DATEPART(mm, A.dd) = DATEPART(mm, b.dd)
ORDER BY A.dd
DECLARE @i VARCHAR(10) = '测试1';
WITH TT
AS ( SELECT number
FROM master..spt_values
WHERE type = 'P'
AND number BETWEEN 0 AND 11
)
SELECT CONVERT(VARCHAR(7), A.dd, 120) AS dd ,
A.数量 ,
A.标题 ,
CONVERT(VARCHAR(7), B.dd, 120) dd ,
B.数量 ,
B.标题
FROM ( SELECT DATEADD(mm, TT.number, '2013-01-01') AS dd ,
T.数量 ,
T.标题
FROM TT
LEFT JOIN test T ON CONVERT(VARCHAR(7), DATEADD(mm,
TT.number,
'2013-01-01'), 120) = T.月份
WHERE T.标题 = @i
OR T.标题 IS NULL
) A
INNER JOIN ( SELECT DATEADD(mm, TT.number, '2014-01-01') AS dd ,
T1.数量 ,
T1.标题
FROM TT
LEFT JOIN test T1 ON CONVERT(VARCHAR(7), DATEADD(mm,
TT.number,
'2014-01-01'), 120) = T1.月份
WHERE T1.标题 = @i
OR T1.标题 IS NULL
) B ON DATEPART(mm, A.dd) = DATEPART(mm, b.dd)