有这样一张表,
名字 日期 任务下发 任务完成
张三 2012-09-01 20 15
李四 2012-09-02 30 20
张三 2012-09-02 30 19
李四 2012-09-03 30 28
我想让他变成这样
2012-09-01发 2012-09-01完成 2012-09-02发 2012-09-02完成
张三 20 15 30 19
李四 0 0 30 20
2012-09-03 我就不写了 求高手写个完整的sql语句!
花费了我一个多小时的结果,望采纳哈哈,代码如下,可能有空格是中文状态下的,你多多留意。
GO
CREATE TABLE [dbo].[Users]
([UserName] [nvarchar](20) NULL, [SDate] [date] NULL,
[GetTask] [int] NULL, [FnishTask] [int] NULL ) ON [PRIMARY]
GO
INSERT [dbo].[Users] ([UserName], [SDate], [GetTask], [FnishTask])
VALUES (N'张三', CAST(0x1A360B00 AS Date), 20, 15)
INSERT [dbo].[Users] ([UserName], [SDate], [GetTask], [FnishTask])
VALUES (N'李四', CAST(0x1A360B00 AS Date), 20, 16)
INSERT [dbo].[Users] ([UserName], [SDate], [GetTask], [FnishTask])
VALUES (N'张三', CAST(0x1B360B00 AS Date), 25, 23)
INSERT [dbo].[Users] ([UserName], [SDate], [GetTask], [FnishTask])
VALUES (N'李四', CAST(0x1B360B00 AS Date), 25, 20)
INSERT [dbo].[Users] ([UserName], [SDate], [GetTask], [FnishTask])
VALUES (N'张三', CAST(0x1C360B00 AS Date), 23, 23)
INSERT [dbo].[Users] ([UserName], [SDate], [GetTask], [FnishTask])
VALUES (N'李四', CAST(0x1C360B00 AS Date), 23, 20)
GO
CREATE TABLE #tempUser(UserName NVARCHAR(20))
INSERT INTO #tempUser(UserName) SELECT DISTINCT(u.UserName) FROM Users u;
CREATE TABLE #tempDate (id INT IDENTITY(1,1),tDate date)
INSERT INTO #tempDate(tDate) SELECT DISTINCT(u.SDate) FROM Users u
DECLARE @dateCounts INT;
SELECT @dateCounts = COUNT(1) FROM #tempDate;
DECLARE @startCounts INT;
SET @startCounts = 1;
WHILE(@startCounts<=@dateCounts)
BEGIN
DECLARE @tempColumnName NVARCHAR(20);
SELECT @tempColumnName=Convert(nvarchar(20),td.tDate) FROM #tempDate td WHERE td.id=@startCounts;
EXECUTE('ALTER TABLE #tempUser ADD ['+@tempColumnName+'发' +'] NVARCHAR(20)')
EXECUTE('ALTER TABLE #tempUser ADD ['+@tempColumnName+'完成' +'] NVARCHAR(20)')
EXECUTE('UPDATE #tempUser SET ['+@tempColumnName+'发' +'] = u.GetTask, ['+@tempColumnName+'完成' +'] = u.FnishTask
FROM #tempUser t
INNER JOIN Users u ON t.UserName=u.UserName
INNER JOIN #tempDate td ON u.SDate=td.tDate
WHERE td.id='+@startCounts);
SET @startCounts = @startCounts+1;
END
SELECT * FROM #tempUser tu;
DROP TABLE #tempUser;
DROP TABLE #tempDate;
SELECT * FROM Users u;
/**我跑的结果是这样的,希望你的也是,呵呵。
虽然没看明白什么意思 但是问题解决了 呵呵 ! 如果有时间顺便给我讲讲啊! 多谢兄台!
行转列 pivot
嗯 我用过 行转列 但是效果是这样的
转置 ,我觉得pivot函数建议不用,因为这个函数在SQL 2000中无法使用,很多公司还是SQL 2000,建议 http://topic.csdn.net/u/20120327/20/abf68d17-eb19-4ad9-aebb-b4aa9bc2b5ee.html
最近也遇到这个问题 先前是用sql xml 的一个转换方法来解决的
后来同事用了一个左连接也轻松解决了 改天贴代码你额
select *
into #temp_aa
from(
select 名字 as Name,日期+'发' as rq,任务下发 as num
from A
union all
select 名字 as Name,日期+'完成' as rq,任务完成 as num
from A
) b
declare @aa nvarchar(2000)
set @aa=' select Name, '
select @aa = @aa + ' sum( case rq when '''+rq+''' then num else null end ) as '''+rq+''' ,'
from (select distinct rq from #temp_aa) a
select @aa = left(@aa,len(@aa)-1) + ' from #temp_aa group by Name '
exec(@aa)
多给点分啊