22,210
社区成员
发帖
与我相关
我的任务
分享
SELECT *
FROM test
WHERE ISDATE(dates+'-01') = 0
--动态写法
GO
DECLARE @Sql NVARCHAR(max)=''
SELECT @Sql=@Sql+',MAX(CASE WHEN [dates]='''+dates+''' THEN score END) AS '+QUOTENAME(dates) FROM (SELECT CONVERT(VARCHAR(7),DATEADD(mm,b.number,a.d1+'-01'),120) FROM (SELECT MIN(dates) AS d1,MAX(dates) AS d2 FROM test) AS a,master.dbo.spt_values AS b WHERE b.type='P' AND DATEADD(mm,b.number,a.d1+'-01')<=a.d2+'-01') AS a([dates])
EXEC('SELECT [MenuName]'+@Sql+' FROM test GROUP BY [MenuName]')
/*
MenuName 2016-12 2017-01 2017-02
a 20 20 NULL
b 20 20 NULL
c NULL 20 20
*/
SELECT MenuName ,
MAX(CASE WHEN dates = '2016-12' THEN score
ELSE 0
END) AS '2016-12' ,
MAX(CASE WHEN dates = '2017-01' THEN score
ELSE 0
END) AS '2017-01' ,
MAX(CASE WHEN dates = '2017-02' THEN score
ELSE 0
END) AS '2017-02'
FROM dbo.test
GROUP BY MenuName
USE tempdb
GO
CREATE TABLE [test] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[MenuName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[score] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[dates] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
insert into test values('a','20','2016-12')
insert into test values('b','20','2016-12')
insert into test values('a','20','2017-01')
insert into test values('b','20','2017-01')
insert into test values('c','20','2017-01')
insert into test values('c','20','2017-02')
GO
SELECT [MenuName]
,MAX(CASE WHEN [dates]='2016-12' THEN score END) AS [2016-12]
,MAX(CASE WHEN [dates]='2017-01' THEN score END) AS [2017-01]
,MAX(CASE WHEN [dates]='2017-02' THEN score END) AS [2017-02]
FROM test
GROUP BY [MenuName]
/*
MenuName 2016-12 2017-01 2017-02
a 20 20 NULL
b 20 20 NULL
c NULL 20 20
*/
GO
--动态写法
DECLARE @Sql NVARCHAR(max)=''
SELECT @Sql=@Sql+',MAX(CASE WHEN [dates]='''+dates+''' THEN score END) AS '+QUOTENAME(dates) FROM test GROUP BY [dates]
EXEC('SELECT [MenuName]'+@Sql+' FROM test GROUP BY [MenuName]')