1、打开SSMS并登录数据库,点击新建查询按钮新建一个查询窗口。下面将用一个三国武将的属性表为例演示如何将多行数据合并成一行。
2、创建一个名为WScore的表,用于保存武将的三围数据。执行以下语句:CREATE TABLE WScore(WName VARCHAR(20), --姓名Subject VARCHAR(20), --属性Score INT --属性值 );
3、接着往WScore表插入一些武将的数据。执行以下语句:INSERT INTO WScore VALUES('姜维','统率',90);INSERT INTO WScore VALUES('姜维','武力',88);INSERT INTO WScore VALUES('姜维','智力',91);INSERT INTO WScore VALUES('张郃','统率',91);INSERT INTO WScore VALUES('张郃','武力',89);INSERT INTO WScore VALUES('张郃','智力',69);INSERT INTO WScore VALUES('陆逊','统率',96);INSERT INTO WScore VALUES('陆逊','武力',69);INSERT INTO WScore VALUES('陆逊','智力',95);
4、执行语句:select * from WScore 查看刚才插入的数据,可以看到武将的三围数据是按属性以多行的形式保存的,接下来要合并成每名武将将一行的形式。
5、可以使用 Case when + group by 的组合来实现多行数据合并,执行以下语句按姓名汇总,可以看到每名武将都合并到一行数据里了。SELECT WName AS '姓名', MAX(CASE Subject WHEN '统率' THEN Score ELSE 0 END) AS '统率', MAX(CASE Subject WHEN '武力' THEN Score ELSE 0 END) AS '武力', MAX(CASE Subject WHEN '智力' THEN Score ELSE 0 END) AS '智力'FROM WScoreGROUP BY WName
6、另外使用PIVOT方法也能实现多行合并的效果,执行如下语句,可以看到查询结果语句上步一样:SELECT A.WName AS '姓名',a.统率,a.武力,a.智力FROM WScorePIVOT(MAX(Score) FOR Subject IN(统率,武力,智力)) AS A