表A
id adress(地址) leval 能源
1 北京 I
2 上海 II
3 广州 III
5 北京 I
7 上海 III
结果
地址 leval(I)总和 leval(II)总和 leval(III)总和
北京 2 0 0
上海 0 1 1
广州 0 0 1
用SQL语句写出表中显示的结果
以上是我遇到的一个题目,自己做了一段时间没完整做出来,问了一个朋友,最终解决了。有两种实现方法。现总结如下:
1.case语句实现
select address,sum(leval1) leval1,sum(leval2) leval2,sum(leval3) leval3 from
(select address,
(case when leval='I' then count(leval) else '0' end) as leval1,
(case when leval='II' then count(leval) else '0' end) as leval2,
(case when leval='III' then count(leval) else '0' end) as leval3
from a
group by address,leval) as leval group by address
2.PIVOT语句实现
SELECT address,[I] as leval1,[II] as leval2,[III] as leval3 FROM
(SELECT address,[leval] FROM a) as P
PIVOT (
count([leval])
FOR
[leval] IN ([I],[II],[III])
) AS T
因为以前没有用过pivot这个语句,所以对这个语句进行了相应的学习。PIVOT 和 UNPIVOT 关系运算符将表值表达式更改为个。PIVOT 通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执行聚合。 PIVOT 提供的语法比一系列复杂的 SELECT...CASE 语句中所指定的语法更简单和更具可读性。
在我们进行复杂的查询统计的时候,特别是销售统计、处理大量数据的时候,PIVOT的作用就显得非常突出。
UNPIVOT 与 PIVOT 执行相反的操作,将表值表达式的列转换为列值。但是在实际应用中,有些聚合之后的数据很难进行拆分。所以呢,UNPIVOT并非PIVOT的逆过程。
建议:如果你想了解的更加清楚,请参考:http://technet.microsoft.com/zh-cn/library/ms177410.aspx
注意:对升级到 SQL Server 2005 或更高版本的数据库使用 PIVOT 和 UNPIVOT 时,必须将数据库的兼容级别设置为 90 或更高。
有的SQL Server 2005初始安装时,默认的兼容级别为“80”,这时我们需要将兼容级别进行设置,不然,PIVOT不能正常的执行。
具体的修改方案如下:
修改兼容级别步骤
1、连接到相应的 SQL Server 数据库引擎实例之后,在对象资源管理器中,单击服务器名称以展开服务器树。
2、展开“数据库”,然后根据数据库的不同,选择用户数据库,或展开“系统数据库”,再选择系统数据库。
3、右键单击数据库,再单击“属性”。“数据库属性”对话框将打开。
4、在“选择页”窗格中,单击“选项”。当前兼容级别显示在“兼容级别”列表框中。
5、若要更改兼容级别,请从列表中选择其他选项。 可用选项包括 SQL Server 2000 (80)、SQL Server 2005 (90) 或 SQL Server 2008 (100)。