--求合計時用sum,求最大時用max SELECT NAME, sum(CASE WHEN [month]=201109 THEN qty ELSE 0 END) AS '201109', sum(CASE WHEN [month]=201110 THEN qty ELSE 0 END) AS '201110', sum(CASE WHEN [month]=201111 THEN qty ELSE 0 END) AS '201111', ............ FROM tablename GROUP BY Name
交叉表 主键:id+lx select * from tab_1;显示结果如下: id lx sj --------------------- 1 1类 03-01-01 1 2类 03-01-02 2 1类 03-02-01 2 2类 03-02-02 2 3类 03-02-03 3 2类 03-03-02 select id,max(decode(lx,'1类',sj)) 1类, max(decode(lx,'2类',sj)) 2类, max(decode(lx,'3类',sj)) 3类 from tab_1 group by id; id 1类 2类 3类 ------------------------------------------- 1 03-01-01 03-01-02 2 03-02-01 03-02-02 03-02-03 3 03-03-02 ..........
使用T-SQL行列相互转换命令:PIVOT和UNPIVOT 一,使用PIVOT 实现数据表的列转行 语法: SELECT <未透视的列>, [第一个透视列] AS <列别名>, [第二个透视列] AS <列别名>, ... [最后一个透视列] AS <列别名> FROM ( <SELECT查询> ) AS <源表> PIVOT ( <聚合函数>(<列>) FOR [<需要转换为行的列>] IN ( [第一个透视列], [第二个透视列], ... [最后一个透视列] ) ) AS <数据透视表> <可选的ORDER BY子句>; 以上的PIVOT子句内的第1…n个透视列的值均为需要转换为行的列的常量值,需要用[]括起,支持GUID,字符串及各种数字!二,使用UNPIVOT 实现的功能其实与PIVOT恰恰相反 语法: SELECT <未逆透视的列>, [合并后的列] AS <列别名>, [行值的列名] AS <列别名> FROM ( ) AS <源表> UNPIVOT ( <行值的列名> FOR <将原来多个列合并到单个列的列名> IN ( [第一个合并列], [第二个合并列], ... [最后一个合并列] ) ) AS <数据逆透视表> <可选的ORDER BY子句>;关于PIVOT和UNPIVOT命令的使用,如果想了解更多SQL的知识可以去看看这里的文章:http://database.51cto.com/sqlserver/,绝对不会让您失望的哦.
--求合計時用sum,求最大時用max
SELECT
NAME,
sum(CASE WHEN [month]=201109 THEN qty ELSE 0 END) AS '201109',
sum(CASE WHEN [month]=201110 THEN qty ELSE 0 END) AS '201110',
sum(CASE WHEN [month]=201111 THEN qty ELSE 0 END) AS '201111',
............
FROM tablename
GROUP BY Name
主键:id+lx
select * from tab_1;显示结果如下:
id lx sj
---------------------
1 1类 03-01-01
1 2类 03-01-02
2 1类 03-02-01
2 2类 03-02-02
2 3类 03-02-03
3 2类 03-03-02 select id,max(decode(lx,'1类',sj)) 1类,
max(decode(lx,'2类',sj)) 2类,
max(decode(lx,'3类',sj)) 3类
from tab_1
group by id; id 1类 2类 3类
-------------------------------------------
1 03-01-01 03-01-02
2 03-02-01 03-02-02 03-02-03
3 03-03-02
..........
一,使用PIVOT 实现数据表的列转行
语法:
SELECT
<未透视的列>,
[第一个透视列] AS <列别名>,
[第二个透视列] AS <列别名>,
...
[最后一个透视列] AS <列别名>
FROM (
<SELECT查询>
) AS <源表>
PIVOT (
<聚合函数>(<列>)
FOR [<需要转换为行的列>] IN (
[第一个透视列], [第二个透视列],
...
[最后一个透视列]
)
) AS <数据透视表>
<可选的ORDER BY子句>; 以上的PIVOT子句内的第1…n个透视列的值均为需要转换为行的列的常量值,需要用[]括起,支持GUID,字符串及各种数字!二,使用UNPIVOT 实现的功能其实与PIVOT恰恰相反
语法:
SELECT <未逆透视的列>, [合并后的列] AS <列别名>, [行值的列名] AS <列别名> FROM ( ) AS <源表> UNPIVOT ( <行值的列名> FOR <将原来多个列合并到单个列的列名> IN ( [第一个合并列], [第二个合并列], ... [最后一个合并列] ) ) AS <数据逆透视表> <可选的ORDER BY子句>;关于PIVOT和UNPIVOT命令的使用,如果想了解更多SQL的知识可以去看看这里的文章:http://database.51cto.com/sqlserver/,绝对不会让您失望的哦.