|
我需要在MS SQL中进行以下转置
/ D* I* r6 k: s* v0 q7 X- B从:
4 ?" X! D& T. e, g: m9 RDay A B ( i. o# H5 M: B. ^4 v8 m" @
---------
, W# {0 N1 Z( UMon 1 2
6 C' c+ J& ]& \6 `# _3 E" S/ OTue 3 45 Z# E+ z; S# e$ T1 z
Wed 5 63 e% i" s9 I& m) t
Thu 7 8- v y7 {. R9 B' H6 Q7 ~
Fri 9 0
9 h: `" [- K% S0 a6 c6 a要以下内容:. v: _8 ?3 d/ {% I0 S
Value Mon Tue Wed Thu Fri 2 H" y$ K7 C$ f+ c
--------------------------
6 Y, H2 c! }7 `A 1 3 5 7 9
! h. }# \/ @( o6 K( q: w. _& H0 Z4 X" OB 2 4 6 8 05 X6 v, z, S- t4 Z& k+ Z7 j% U' Q
我了解PIVOT只有一列(A)时该如何处理,但无法弄清有多列要转置(A,B,…)时该如何做。
4 z% }. A, \8 m/ S6 |6 u要转置的示例代码:. ~8 ]' @9 Q2 \3 z/ D& ?
select LEFT(datename(dw,datetime),3) as DateWeek,
) |4 _% r1 }& U- F sum(ACalls) as A,
! G) |" s. m- u( Z Sum(BCalls) as B / c% b* \4 @4 B3 ]
from DataTable9 P% d( X# ~- ^0 e8 v
group by LEFT(datename(dw,datetime),3)* I) e( S2 v0 `: A- l
表结构:6 o V8 P- |; U( t
Column DataType
! J5 i4 @0 r* W6 m, O, ODateTime Datetime, U" ?" d9 T7 I( k% F
ACalls int
4 g1 F& Q% v1 h2 N1 |! L3 OBCalls int
( \; z# K$ ^5 k6 o# i5 ^3 ^7 O! [任何帮助都感激不尽。- z0 R# ^3 z n2 f/ y
( m3 t( K) I8 C
解决方案:
0 J4 Y# N" t- r0 P+ I/ `/ t' u
! u7 ?* B Z+ T5 P* K ]& e3 ?4 L. E& d$ p; \. X E
! @5 M& P2 \8 Q. B
为了将数据转置为所需的结果,您将需要同时使用UNPIVOT和PIVOT函数。
, n7 v; v$ I# Q+ R6 z# l8 _该UNPIVOT函数采用A和B列,并将结果转换为行。然后,您将使用该PIVOT函数将day值转换为列: j0 B+ d2 m4 i. n: y
select *, i8 X% ]- f4 c7 W
from6 T) \+ T5 z3 V$ f5 r6 b
(
. I$ s$ @% k9 u6 l5 ?* h select day, col, value7 ^+ z; n3 {3 m( o( l Q" Y
from yourtable7 }' ], k2 K$ N# w5 ]4 i
unpivot& m8 @' G" z* ]% g; i
( l- |0 c4 V& _0 ]
value. E: W* V7 k$ i/ w+ Y
for col in (A, B)# E9 Z4 P; w& u w' u6 R" L) W5 j7 k
) unpiv
: V* z* y2 B! D2 e) src$ H4 W% M4 b9 r# S/ m4 ]% f. f
pivot' a/ {) E: M9 v# x: q, `6 y$ {3 E
(
, A, m% o: M4 K+ B1 r3 _ max(value)
' h* o( a7 S6 s& Q for day in (Mon, Tue, Wed, Thu, Fri)
# T6 ? N5 \5 q; t# {0 \) piv5 u4 a/ N& c J4 x' ^
请参阅带有演示的SQL Fiddle。6 D: f) i' g: ]+ c" E k
如果使用的是SQL Server 2008+,则可以使用CROSS APPLYwithVALUES取消透视数据。您的代码将更改为以下内容:
0 ]4 w5 R- u p6 i0 x' D1 Eselect *
" z. R( L) U# dfrom
7 Q8 ^# @/ ^1 H; F($ J$ C" y( |- ?! }8 b
select day, col, value1 E% Y# G. j. N! x5 k
from yourtable
; t3 k# c4 A( e' O0 _* ^ cross apply
3 t: H" M2 D9 y2 o (, \5 j, o3 ?- {: H' M, c9 X: z
values ('A', A),('B', B)+ i9 x/ R6 ~( ^ W# s7 ?
) c (col, value)) |2 N: L% W; Q; n
) src. @$ w, X7 G5 m% X: @
pivot
$ F" o' j, _. ~" c7 }(/ G {% t- t1 H6 Z; x4 {
max(value)! Y* {1 ~5 M$ V) i9 q- M8 ^4 \, E
for day in (Mon, Tue, Wed, Thu, Fri); L9 d! \& F; q# \: u* }
) piv! [5 _- g2 i# J; `
请参阅带有演示的SQL Fiddle。3 C+ d9 G# U) u) [. f8 }0 `
编辑#1,将当前查询应用到上述解决方案中,您将使用类似于以下内容的内容:
$ {# S" M& b- l) F7 xselect *
8 _/ I( q3 j5 H4 Ffrom" V- r+ @" s" ~. A- a) q" p0 q3 I
(
# J5 H7 m4 s7 M7 u5 q4 n select LEFT(datename(dw,datetime),3) as DateWeek,
8 y0 \# A. n$ [ col, 2 P% G+ F* i m& f+ v
value
- V- M; a1 b# ? from DataTable ! f/ a. [% G4 H3 D5 h
cross apply
9 n8 a6 f) p" N5 S (9 V8 @' X& B7 }! u8 `$ v# D/ ]
values ('A', ACalls), ('B', BCalls)
7 ~5 K, [9 \4 j+ v# w6 u# T$ @/ G9 [ ) c (col, value)4 M g% c5 B0 q# b: H0 ~- `1 f
) src& k+ v" e( _( \) K5 P0 G2 T7 R; n
pivot* u' h5 H' l& _5 ^4 l9 h
(
4 m& n- K+ B; ?6 G1 ] sum(value)
+ C. C# N$ F# }) b) [3 L' v$ W for dateweek in (Mon, Tue, Wed, Thu, Fri)! i3 C7 q2 ]* r% q% b3 x- [
) piv |
|