回答

收藏

SQL转置全表

技术问答 技术问答 167 人阅读 | 0 人回复 | 2023-09-13

我需要在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
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则