回答

收藏

转置MySQL查询-需要将行分为列

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

一个菜鸟MYSQL用户....我有一个简单的MySQL查询,该查询返回值,并使用GROUP_CONCAT函数:
- L5 l5 ?7 ]/ J" bSELECT Productid, Name, GROUP_CONCAT(value)
: {$ e" Z; M4 Q% d; Q! E1 H. B: WFROM search_export ' Y8 u2 D3 Y) |. H! R' P8 {
Group By Productid, Name;! t. W, a, t1 a2 A5 t$ j2 N
Productid   Name                     GROUP_CONCAT(value)
8 A; {7 ~* _3 X3 J666056542   Brand Name           Netgear
% N& U/ C; F% z& U  Q1054677552  Ethernet Technology  Gigabit Ethernet* W: U, K# A% k5 _9 N0 z) t
665655662   Form Factor          Wall Mountable,Desktop
( n; @5 X+ f, l5 Z0 M" o& t56565765    Media Type Supported     Twisted Pair
: \1 Y0 T1 y6 T& K但是,我需要转置查询,以便它以单独的列而不是行的形式返回“名称”。MySQL完全有可能吗?4 @" Z( _. {2 m. G& u5 \
                5 j4 B' R- {# a7 u* d
解决方案:2 h/ `0 l) ^5 O+ K$ L% s
               
4 k( v% X( K, v% d! E5 k
  \& b+ B" X4 t. \" Y8 A* ]# X9 X& L
                您需要执行一项PIVOT操作,MySQL本身不支持该操作(与某些其他RDBMS不同)。0 z7 K3 N; X% S8 e
您可以获得的最接近的结果是按照以下几行构造SQL:
8 N3 y! R. a( T+ F9 PSELECT   ProductId,
: U7 R8 C% @& m- ]5 k. z         GROUP_CONCAT(IF(Name='Brand Name'          ,value,NULL))
+ Q( k) ]  @; Z, C           AS `Brand Name`,
+ g4 ?+ h% a: u; o         GROUP_CONCAT(IF(Name='Ethernet Technology' ,value,NULL))
8 a5 g6 Z1 j: h% l+ Z3 \           AS `Ethernet Technology`,
6 O% s  a3 d9 `9 ]! o         GROUP_CONCAT(IF(Name='Form Factor'         ,value,NULL))' a: g7 Y$ f# H. L+ W& K9 l, f
           AS `Form Factor`,2 I# T' \7 K1 v9 }
         GROUP_CONCAT(IF(Name='Media Type Supported',value,NULL))0 ~5 m+ p  P3 f6 s8 l
           AS `Media Type Supported`
6 J" r2 `* L' a$ q) P! x7 ~FROM     search_export7 N7 J9 @; F" Q& z
GROUP BY ProductId% ?+ n  c2 g, m
如果可能的Name值是动态的,则可以从以下结果中以更高级的语言生成此类SQL:) W2 w0 w6 [6 s, s7 p" o! H
SELECT DISTINCT Name FROM search_export  B; x* b: ~2 A) ?: ]
确实,甚至可以使用SQL本身:: c  ~' v; k$ J7 P+ b1 s
SELECT CONCAT('+ S# v8 e9 z) {6 @* I+ S
         SELECT   ProductId, ',* E0 {0 ?- Q' D* r( i
       GROUP_CONCAT('9 R% S/ m5 @7 h
                  GROUP_CONCAT(IF(Name=',QUOTE(Name),',value,NULL))4 V# N: \: G% y( d6 ~$ y
                    AS `',REPLACE(Name,'`','``'),'`'$ h7 g0 j; q* \/ i
       ), '6 ]8 @/ @+ `/ ?
         FROM     search_export
- R* d7 c5 C: A5 I1 N, H% X         GROUP BY ProductId
: w- R/ h- N# n7 y       ')& {5 @( B- C: m6 J$ f
INTO @sql4 C( i$ {# {# y3 L
FROM (
& a8 R; w* w, u. q  SELECT DISTINCT Name FROM search_export: g8 h% V6 ^" \; F. c) p
) t;" ^5 m) ~+ a/ a' b! Y% T: X2 F
PREPARE stmt FROM @sql;
2 q3 ^" y) P- j; d! ]EXECUTE stmt;
) B: U9 C) ]0 K+ q7 \/ ?/ @6 E9 sDEALLOCATE PREPARE stmt;
5 |' m- G& f5 S; K7 U请注意,如果有很多不同的Name值,则可能需要增加group_concat_max_len其默认值1KiB。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则