下面就是 UNPIVOT 的语法:
SELECT [columns not unpivoted], [unpivot_column], [value_column], FROM (
Where:
为了更好地理解我们看下面的例子:
USE tempdb; GO IF object_id('PhoneNumbers') IS NOT NULL DROP TABLE PhoneNumbers; GO CREATE TABLE PhoneNumbers ( PersonID int, HomePhone varchar(12), CellPhone varchar(12), Workphone varchar(12), FaxNumber varchar(12)); INSERT INTO PhoneNumbers VALUES (1,Null,'444-555-2931',Null,Null), (2,'444-555-1950','444-555-2931',Null, Null), (3,'444-555-1950', Null,'444-555-1324','444-555-2310'), (4,'444-555-1950','444-555-2931','444-555-1324', '444-555-1987');
SELECT PersonID, PhoneType, PhoneNumber FROM ( SELECT PersonID, HomePhone, CellPhone, Workphone, FaxNumber FROM PhoneNumbers ) AS Src UNPIVOT ( PhoneNumber FOR PhoneType IN (HomePhone, CellPhone, WorkPhone, FaxNumber)) AS UNPVT;
第二个例子中,我将使用两个操作符来行转列来转换一套名字/值 的两列数据。具体如下:
在表 CustPref里面 我有四对名称和值。
我们将使用不同的UNPIVOT操作符来创建一个结果集,每一个PrefType的名字和值针对每个CustID 和CustName。并联使用操作符的作用是为了转换两组列。这样讲能表示为一个参数名称和值在一行里面。执行代码如下:
http://www.cnblogs.com/wenBlog/
通过这个输出结果,能发现不同的type对应不同的值得列,并且要关联CustID。整个查询通过两个不同的UNPOVOT操作符同时使用了where 子句来合并输出结果(基于列名前五个字符相同的进行匹配),第一个行转列转换的是数据,第二个为类型,where限制了比较前五个字符,我能取得匹配的数据组。
SELECT year as 年份
, sum (case when quarter = 'Q1' then amount else 0 end) 一季度
, sum (case when quarter = 'Q2' then amount else 0 end) 二季度
, sum (case when quarter = 'Q3' then amount else 0 end) 三季度
, sum (case when quarter = 'Q4' then amount else 0 end) 四季度
FROM SalesByQuarter GROUP BY year ORDER BY year DESC
SELECT year as 年份, Q1 as 一季度, Q2 as 二季度, Q3 as 三季度, Q4 as 四季度 FROM SalesByQuarter PIVOT (SUM (amount) FOR quarter IN (Q1, Q2, Q3, Q4) ) AS P ORDER BY YEAR DESC
得到的结果如下:
-- ------------------------
-- 列转行统计数据
-- ------------------------
SELECT
Date
,
MAX
(
CASE
NAME
WHEN
'小说'
THEN
Scount
ELSE
0
END
) 小说,
MAX
(
CASE
NAME
WHEN
'微信'
THEN
Scount
ELSE
0
END
) 微信
FROM
TabName
GROUP
BY
Date
|
select
Date
, group_concat(
NAME
,
'总量:'
,Scount)
as
b_str
from
TabName
group
by
Date
|
select
Date
,
NAME
, group_concat(
NAME
,
'总量:'
,Scount)
as
b_str
from
TabName
group
by
Date
,
NAME
|