关于数据库列转行的问题。 SQL SERVER 2005以后列转行有个函数可以直接用。
2000的数据库我当初做的时候用的是
select 日期,
max(case id when '列头A' then 值 end ) as 列头A,
max(case id when '列头B' then 值 end ) as 列头B,
max(case id when '列头C' then 值 end ) as 列头C,
max(case id when '列头D' then 值 end ) as 列头D
FROM (SELECT 日期,列头(包含ABCD),值 from table ) t1 group by thisd
SELECT 日期,列头(包含ABCD),值 from table
的查询结果是这样的
日期 列头 值
20140101 A 100
20140101 B 100
20140101 C 100
20140102 A 100
20140102 B 100
20140102 C 100
20140103 A 100
20140103 B 100
20140103 C 100
我想知道这里的MAX到底是什么用处啊。。
除了因为配合GROUP BY 要用聚合包起来。
那换成MIN之类的不是一样效果么?
------解决方案-------------------- 其实你那个查询应该是case when xx then 值 else null end 这样,而null比那个“值”小,所以用max,如果换min,就会显示null出来 ------解决方案-------------------- ELSE else_result_expression
比较运算计算结果不为 TRUE 时返回的表达式。如果忽略此参数且比较运算计算结果不为 TRUE,则 CASE 返回 NULL。else_result_expression 是任意有效的表达式。else_result_expression 及任何 result_expression 的数据类型必须相同或必须是隐式转换的数据类型。
也就是说你的代码里面如果不符合case 条件,会返回null,null 比你的值小。 ------解决方案-------------------- 这个还要看你业务,比如“A”一天有几个值,你业务上求 sum ? 求 Max ? 求 Min.
declare @sql varchar(2000)
set @sql='select ,'
select @sql=@sql+'sum(case when 列头='''+列头+''' then 值 else 0 end) as '+列头+',' from
(
select distinct 列头 from 表名
)tb
set @sql=substring(@sql,1,len(@sql)-1)
set @sql=@sql+' from 表名 group by 日期 ' ------解决方案--------------------