22,210
社区成员
发帖
与我相关
我的任务
分享
--测试数据
CREATE TABLE Tasks
(ID bigint IDENTITY(1,1),
ProjectID nvarchar(255),
PersonName nvarchar(255),
CurrentWorking nvarchar(50),
TaskDate nvarchar(50))
insert tasks(ProjectID,Personname,currentWorking,taskdate) values('1','张三','挖地','2010-5-29')
insert tasks(ProjectID,Personname,currentWorking,taskdate) values('1','李四','挖土','2010-7-7')
insert tasks(ProjectID,Personname,currentWorking,taskdate) values('2','王二','浇水','2010-6-18')
insert tasks(ProjectID,Personname,currentWorking,taskdate) values('2','麻子','松土','2010-7-7')
insert tasks(ProjectID,Personname,currentWorking,taskdate) values('3','王一','采摘','2010-6-3')
insert tasks(ProjectID,Personname,currentWorking,taskdate) values('3','麻三','修剪','2010-7-9')
--测试数据
CREATE TABLE Tasks
(ID bigint IDENTITY(1,1),
ProjectID nvarchar(255),
PersonName nvarchar(255),
CurrentWorking nvarchar(50),
TaskDate nvarchar(50))
insert tasks(ProjectID,Personname,currentWorking,taskdate) values('1','张三','挖土','2010-5-29')
insert tasks(ProjectID,Personname,currentWorking,taskdate) values('1','李四','挖土','2010-7-7')
insert tasks(ProjectID,Personname,currentWorking,taskdate) values('2','王二','浇水','2010-6-18')
insert tasks(ProjectID,Personname,currentWorking,taskdate) values('2','麻子','松土','2010-7-7')
insert tasks(ProjectID,Personname,currentWorking,taskdate) values('3','王一','采摘','2010-6-3')
insert tasks(ProjectID,Personname,currentWorking,taskdate) values('3','麻三','修剪','2010-7-9')
DECLARE @s VARCHAR(MAX),@s1 VARCHAR(MAX)
SELECT @s=ISNULL(@s+',','')+QUOTENAME(ProjectID),
@s1=ISNULL(@s1+',','')+'ISNULL('+QUOTENAME(ProjectID)+','''')'+QUOTENAME(ProjectID)
FROM Tasks
GROUP BY ProjectID
EXEC('
SELECT PersonName,'+@s1+'
FROM (
SELECT ProjectID, PersonName,
CASE PersonName
WHEN (
SELECT TOP 1 PersonName
FROM Tasks
WHERE ProjectID = t.ProjectID
ORDER BY CASE
WHEN TaskDate>GETDATE() THEN 0
ELSE 1
END, ABS(DATEDIFF(dd, GETDATE(), TaskDate))
) THEN CurrentWorking
ELSE ''''
END CurrentWorking
FROM Tasks t
) a
PIVOT (MAX(CurrentWorking) FOR ProjectID IN('+@s+')) b
')
/*
李四 挖土
麻三 修剪
麻子
王二 浇水
王一
张三
*/
--那应该是这个结果才对啊
DECLARE @s VARCHAR(MAX),@s1 VARCHAR(MAX)
SELECT @s=ISNULL(@s+',','')+QUOTENAME(ProjectID),
@s1=ISNULL(@s1+',','')+'ISNULL('+QUOTENAME(ProjectID)+','''')'+QUOTENAME(ProjectID)
FROM Tasks
GROUP BY ProjectID
EXEC('
SELECT PersonName,'+@s1+'
FROM (
SELECT ProjectID, PersonName,
CASE CurrentWorking
WHEN (
SELECT TOP 1 CurrentWorking
FROM Tasks
WHERE ProjectID = t.ProjectID
ORDER BY CASE
WHEN TaskDate>GETDATE() THEN 0
ELSE 1
END, ABS(DATEDIFF(dd, GETDATE(), TaskDate))
) THEN CurrentWorking
ELSE ''''
END CurrentWorking
FROM Tasks t
) a
PIVOT (MAX(CurrentWorking) FOR ProjectID IN('+@s+')) b
')
/*
PersonName 1 2 3
李四 挖土
麻三 修剪
麻子
王二 浇水
王一
张三
*/
sp_dbcmptlevel 库名,90
DECLARE @s VARCHAR(MAX),@s1 VARCHAR(MAX)
SELECT @s=ISNULL(@s+',','')+QUOTENAME(ProjectID),
@s1=ISNULL(@s1+',','')+'ISNULL('+QUOTENAME(ProjectID)+','''')'+QUOTENAME(ProjectID)
FROM Tasks
GROUP BY ProjectID
EXEC('
SELECT PersonName,'+@s1+'
FROM (
SELECT ProjectID, PersonName,
CASE CurrentWorking
WHEN (
SELECT TOP 1 CurrentWorking
FROM Tasks
WHERE ProjectID = t.ProjectID
ORDER BY ABS(DATEDIFF(dd, GETDATE(), TaskDate))
) THEN CurrentWorking
ELSE ''''
END CurrentWorking
FROM Tasks t
) a
PIVOT (MAX(CurrentWorking) FOR ProjectID IN('+@s+')) b
')
/*
PersonName 1 2 3
李四
麻三
麻子
王二 浇水
王一 采摘
张三 挖地
*/
DECLARE @s VARCHAR(MAX),@s1 VARCHAR(MAX)
SELECT @s=ISNULL(@s+',','')+QUOTENAME(ProjectID),
@s1=ISNULL(@s1+',','')+'ISNULL('+QUOTENAME(ProjectID)+','''')'+QUOTENAME(ProjectID)
FROM Tasks
GROUP BY ProjectID
EXEC('
SELECT PersonName,'+@s1+'
FROM (
SELECT ProjectID, PersonName, CurrentWorking
FROM Tasks
) a
PIVOT (MAX(CurrentWorking) FOR ProjectID IN('+@s+')) b
')
/*
PersonName 1 2 3
李四 挖土
麻三 修剪
麻子 松土
王二 浇水
王一 采摘
张三 挖地
*/
declare @sql varchar(8000)
select @sql=isnull(@sql+',','')
+'max(case when id='+ltrim(ProjectID)+' then CurrentWorking else '''' end) as ['+ltrim(ProjectID)+']'
from(select distinct ProjectID from tasks) t
exec('select PersonName,'+@sql+' from tasks group by PersonName')
/**
PersonName 1 2 3
-------------------- ---------- ---------- ----------
李四 挖土
麻三
麻子
王二 浇水
王一
张三 挖地
(6 行受影响)
**/
declare @sql varchar(8000)
select @sql=isnull(@sql+',','')
+'max(case when id='+ltrim(id)+' then CurrentWorking else '''' end) as ['+ltrim(id)+']'
from(select distinct id from tasks) t
exec('select PersonName,'+@sql+' from tasks group by PersonName')
/**
PersonName 1 2 3 4 5 6
-------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- --------------------------------------------------
李四 挖土
麻三 修剪
麻子 松土
王二 浇水
王一 采摘
张三 挖地
(6 行受影响)
**/