日期:2014-05-18  浏览次数:20364 次

一位转二维的语句——求解
数据库如下:

ID Man PrintDate Times
1 羅邦偉 2009/4/1 1
2 梅強 2009/4/3 2
3 周林江 2009/5/5 1
4 周強 2009/7/2 1
5 陳剛 2009/5/14 1
6 陳華林 2009/12/1 1
7 羅邦偉 2009/10/10 2
8 方文祥 2009/8/18 1
9 周強 2009/7/27 2
10 陳剛 2009/10/29 1
11 陳華林 2009/11/12 1
12 李林峰 2009/4/6 2
通过以下语句:

declare @sql varchar(8000) --为什么要这么大? 5分
set @sql='select Man' --select Man 作为最左边的字段吗?为什么又来一次@sql? 15分
select @sql=@sql+',['+dd+']=sum(case convert(varchar(10),PrintDate,120) when '''+dd+''' then Times else 0 end)'
-- 为什么是 @sql=@sql+? sum(case convert(varchar(10),PrintDate,120) when '''+dd+''' then Times else 0 end)就可以把PrintDate打横来摆放吗? 25分
from (select distinct dd=convert(varchar(10),PrintDate,120) from Table1)a
set @sql=@sql+' from Table1 group by Man' --在这里的第二个@sql是什么结果? 15分
exec(@sql)
得到了下面的结果:
Man 2009/4/1 2009/4/3 2009/4/6 2009/5/5 2009/5/14 2009/7/2 2009/7/27 2009/8/18 2009/10/10 2009/10/29 2009/11/12 2009/12/1
方文祥 0 0 0 0 0 0 0 1 0 0 0 0
李林峰 0 0 2 0 0 0 0 0 0 0 0 0
周林江 0 0 0 1 0 0 0 0 0 0 0 0
周強 0 0 0 0 0 1 2 0 0 0 0 0
梅強 0 2 0 0 0 0 0 0 0 0 0 0
陳剛 0 0 0 0 1 0 0 0 0 1 0 0
陳華林 0 0 0 0 0 0 0 0 0 0 1 1
羅邦偉 1 0 0 0 0 0 0 0 2 0 0 0

我是新手,套用了网上的资料得到,但是对于那句SQL语句基本上不明白是什么意思。请高手解答,不胜感激!!



------解决方案--------------------
SQL code

declare @sql varchar(8000) --为什么要这么大? 5分--如果转换的字段很多,那么拼接出来的字符串会很长
set @sql='select Man' --select Man 作为最左边的字段吗?为什么又来一次@sql? 15分--这个是为之后的拼接整体的语句准备的第一部分
select @sql=@sql+',['+dd+']=sum(case convert(varchar(10),PrintDate,120) when '''+dd+''' then Times else 0 end)'
-- 为什么是 @sql=@sql+? sum(case convert(varchar(10),PrintDate,120) when '''+dd+''' then Times else 0 end)就可以把PrintDate打横来摆放吗? 25分--这一不是为了循环凭借,把每一个出现的时间都用sum()里面的方法处理
from (select distinct dd=convert(varchar(10),PrintDate,120) from Table1)a
set @sql=@sql+' from Table1 group by Man' --在这里的第二个@sql是什么结果? 15分--这个拼接出来的就是整个查询语句,楼主打印出来看看print  @sql,一切你都知道了
exec(@sql)