急!!!!SQL分组函数问题

来源:百度知道 编辑:UC知道 时间:2024/06/05 17:33:38
表a
tm1 tm2 tm3
a 1 一
a 2 三
a 3 二
b 1 四
b 2 五
c 1 六
c 2 七
c 3 八
c 4 九
其中tm3列是不重复的,tm2列只有4个值,tm1列的值有重复
现在我想得到这样一个结果
tn1 tn2 tn3 tn4 tn5
a 一 三 二
b 四 五
c 六 七 八 九
其中tn1列是tm1列的去重之后的结果
tn2列是以tm2列中值为1的tm3列的值
tn3列、tn4列、tn5列分别对应的就是tm2中的2、3、4对应的tm3列的值,如果没有的话以空值代替
如果tm2列中有200个值呢?

select tm1 as tn1,
max(case tm2 when 1 then tm3 end ) as tn2,
max(case tm2 when 2 then tm3 end ) as tn3,
max(case tm2 when 3 then tm3 end ) as tn4,
max(case tm2 when 4 then tm3 end ) as tn5
from dbo.a
group by tm1

应该是不可以吧,你把tn1去重后在分组后面的,我觉得不行,你可以把这些、数据分别去重后在分组插入到另外一张表里就好了,这样容易多了。
比如 select distinct tm1 into aaa from tm1
这样就创建了一个aaa的表,表aaa中tm1的字段就是tm1的去重数据
当然你也可以自己建立一个那样的表在分别插入进去
一句话分这么多组,我觉得不可能

select tm1 as tn1,
count(case tm2 when 1 then 1 end ) as tn2,
count(case tm2 when 2 then 1 end ) as tn3,
count(case tm2 when 3 then 1 end ) as tn4,
count(case tm2 when 4 then 1 end ) as tn5
from 表a
group by tm1

如果tm2列中有多个值,最好采用存储过程或自定义函数来处理数据,统一返回结果表。
也可以先用sql语句或vb等编程语言生成查询语句,再调用生成的语句进行查询。
如果像你说的有200个值的话,还是用存储过程或自定义函数的好,因为如果用第二种方法生成的直接查询语句一定会非常的长,不但不利于调试,而且有可能超出变量的长度范围导致报错。

如果tm2有200个不同的值或更多个,那么就需要动态构建查询语句,如下(已调试通过):
declare @sql varchar(8000);
decla