回答

收藏

根据字段的值对数据进行分类

技术问答 技术问答 258 人阅读 | 0 人回复 | 2023-09-14

我有一张像这样的表:  \! K3 g( Z" D5 l) [
userid    cityid; t7 X. p% s& `
1         4
+ K* F$ }! ~/ w7 i1         5, {! z# S! `! C$ N" i" s3 E* o/ h
2         4
) b: L6 `2 ~& z7 A2         1
  W/ f" m  }7 M" i7 v3         14 h- b: Z$ ]' d
3         5
3 W/ x- |4 F1 }/ t! P" B& sSQL或蜂巢中是否有一种方法可以将其转换为类似表的形式:5 \" S8 c8 w% R  h, i) z
userid    city1    city4   city5
% B. O3 |- n' B( O1         false    true    true3 v# S' a8 G- C3 d8 n/ ]+ _
2         true     true    fase
1 P  `& Y1 p0 O& z- J3         true     false   true
9 F# J0 G7 @. E  B, c  Y我不确定有没有一个词来描述这种操作…任何帮助将不胜感激!. ~/ q+ k, F  }. R8 z) n
               
& q* r, A* c9 N; w解决方案:
/ o/ T/ |& U$ N$ R, z; [! a5 E               
* O! M8 A! B; D8 X+ I8 Q7 }& b6 _8 S" r6 z& }! Z- o2 G
5 A, W7 V5 J3 e7 V
                这基本上是一个PIVOT。您没有指定要使用的RDBMS,但是可以使用聚合函数和CASE语句在任何数据库中获取结果:
/ q* u$ r. i  `/ w" Uselect userid,
( d9 i6 k/ G" M' J% V1 T  max(case when cityid = 1 then 'true' else 'false' end) city1,
* m: G, i4 h( A( {  max(case when cityid = 2 then 'true' else 'false' end) city2,) l3 c8 l+ `" }" |  S8 q
  max(case when cityid = 3 then 'true' else 'false' end) city3,0 B! b$ s0 h, _; A+ }+ e
  max(case when cityid = 4 then 'true' else 'false' end) city4,0 Z1 H! W# W) z9 A4 D1 u. F
  max(case when cityid = 5 then 'true' else 'false' end) city5
4 c3 J" Z: \2 Gfrom yourtable
; {$ I8 u! k" {1 t2 Ygroup by userid( i, r! U) Y! |- w/ U  d; h0 C
参见带有演示的SQL Fiddle
- _- J% `9 V$ R( c2 c# b结果:; h, i7 [( k7 L. _3 ^
| USERID | CITY1 | CITY2 | CITY3 | CITY4 | CITY5 |) `  ?4 j6 L- a$ X% F
--------------------------------------------------
6 B9 Y6 m1 a' r& D|      1 | false | false | false |  true |  true |
6 Z0 d4 X' h+ a$ v; X+ F  r- u, X|      2 |  true | false | false |  true | false |& Z" J4 K3 c1 D  n4 [
|      3 |  true | false | false | false |  true |
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则