第7章 透視 逆透視及分組集

2021-06-08 13:31:13 字數 2809 閱讀 7309

use tempdb;

go--第7章 透視、逆透視及分組集

--7.1 透視轉換

--透視轉換(pivoting)是一種把資料從行的狀態轉換為列的狀態的處理

if object_id('dbo.orders', 'u') is not null

drop table dbo.orders;

create table dbo.orders

(orderid int not null,

orderdate date not null,

empid int not null,

custid varchar(5) not null,

qty int not null,

constraint pk_orders primary key(orderid)

);insert into dbo.orders(orderid, orderdate, empid, custid, qty)

values

(30001, n'20070802', 3, 'a', 10),

(10001, n'20071224', 2, 'a', 12),

(10005, n'20071224', 1, 'b', 20),

(40001, n'20080109', 2, 'a', 40),

(10006, n'20080118', 1, 'c', 14),

(20001, n'20080212', 2, 'b', 12),

(40005, n'20090212', 3, 'a', 10),

(20002, n'20090216', 1, 'c', 20),

(30003, n'20090418', 2, 'b', 15),

(30004, n'20070418', 3, 'c', 22),

(30007, n'20090907', 3, 'd', 30);

select * from dbo.orders;

select empid, custid, sum(qty) as sumqty

from dbo.orders

group by empid, custid

--7.1.1 使用標準sql進行透視轉換

--擴充套件階段通過在select子句中為每個目標指定case表示式來實現

select empid,

sum(case when custid = 'a' then qty end) as a,

sum(case when custid = 'b' then qty end) as b,

sum(case when custid = 'c' then qty end) as c,

sum(case when custid = 'd' then qty end) as d

from dbo.orders

group by empid

--7.1.2 使用t-sql pivot運算子進行透視轉換

--對於pivot運算子有個重要的地方須要注意:不須要為它顯式地指定分組元素,

--也就不需要在查詢中使用group by子句。pivot運算子隱式地把源表(或表表示式)

--中即沒有指定為擴充套件元素,也沒有指定為聚合元素的那些元素作為分組元素

select empid, a, b, c, d

from(

select empid, custid, qty

from dbo.orders) as d

pivot(sum(qty) for custid in(a, b, c, d)) as p

select custid, [1], [2], [3]

from (select empid, custid, qty from dbo.orders) as o

pivot(sum(qty) for empid in ([1],[2],[3])) as p

--7.2 逆透視轉換

--逆透視轉換(unqivoting)是一種把資料從列的狀態旋轉為行的狀態的技術

if object_id('dbo.empcustorders', 'u') is not null

drop table dbo.empcustorders

select empid, a, b, c, d

into dbo.empcustorders

from (select empid, custid, qty from dbo.orders) as tt

pivot(sum(qty) for custid in (a, b, c, d)) as p

select * from dbo.empcustorders

select * from(

select empid, custid,

case custid

when 'a' then a

when 'b' then b

when 'c' then c

when 'd' then d

end as qty

from dbo.empcustorders

cross join (values('a'), ('b'), ('c'), ('d')) as c(custid)) as d

where qty is not null

--7.2.2 使用tsql的unpivot運算子進行逆透視轉換

select empid, custid, qty

from dbo.empcustorders

unpivot(qty for custid in (a, b, c, d)) as up;

逆透視轉換

逆透視轉換是一種將資料從列的狀態轉換成行的狀態的一種技術。進行逆透視轉換一般要經歷三個邏輯處理階段 生成副本,提取元素和刪除不相關的交叉。下面是乙個進行逆透視轉換的示例。use tempdb go 逆透視轉換 列轉行 準備測試資料 ifobject id dbo.orders u is notnul...

逆透視轉換

逆透視轉換 unpivoting 是一種把資料從列的狀態旋轉為行的狀態的技術。通常,它涉及查詢資料的透視狀態,將來自單個記錄中多個列的值擴充套件為單個列中具有相同值的多個記錄。換句話說,把透視表中的每個源行潛在地轉換成多個行,每行代表源透視表的乙個指定的列值。使用標準sql 進行逆透視轉換 解決方案...

消失點計算 逆透視變換(IPM)

當我們看火車軌道的時候總在某個距離上看到兩條軌道重合到一起後消失。原圖四個點選擇 下面的 是智慧型駕駛系統專案中的原始碼,這裡把opencv中的介面稍微封裝了一下,其中有些與透視變換無關的引數,可以忽略不管 比較重要的一點是 這裡的原圖的四個點是通過車載攝像頭的標定資訊計算出來的,可以通過車載攝像頭...