我有一个看起来像这样的表:
ID | FIELD_NAME | VALUE
23 | sign_up | yes
23 | first_name | Fred
23 | street | Barber Lane
24 | sign_up | no
24 | first_name | Steve
24 | street | Camaro St.
25 | sign_up | yes
25 | first_name | Larry
25 | street | Huckleberry Ave
Run Code Online (Sandbox Code Playgroud)
我想运行一个查询,它将选择唯一的ID和值作为命名列,所以它看起来像这样:
ID | SIGN_UP | FIRST_NAME | STREET |
23 | yes | Fred | Barber Lane |
24 | no | Steve | Camaro St. |
25 | yes | Larry | Huckleberry Ave. |
Run Code Online (Sandbox Code Playgroud)
任何帮助将非常感激!!
您可以使用这个简单的解决方案
SELECT DISTINCT
a.id,
b.value AS SIGN_UP,
c.value AS FIRST_NAME,
d.value AS STREET
FROM tbl a
LEFT JOIN tbl b ON a.id = b.id AND b.field_name = 'sign_up'
LEFT JOIN tbl c ON a.id = c.id AND c.field_name = 'first_name'
LEFT JOIN tbl d ON a.id = d.id AND d.field_name = 'street'
Run Code Online (Sandbox Code Playgroud)
为了安全起见,我做了连接LEFT JOIN,因为我不知道id是否可以丢失字段,在这种情况下它们将显示NULL在我们的派生列中.
您还可以在分组和条件聚合的帮助下尝试旋转:
SELECT
ID,
MAX(CASE FIELD_NAME WHEN 'sign_up' THEN VALUE END) AS SIGN_UP,
MAX(CASE FIELD_NAME WHEN 'first_name' THEN VALUE END) AS FIRST_NAME,
MAX(CASE FIELD_NAME WHEN 'street' THEN VALUE END) AS STREET
FROM atable
GROUP BY
ID
;
Run Code Online (Sandbox Code Playgroud)