【问题标题】:How to create 2 columns using data from 1 column and merging them如何使用来自 1 列的数据创建 2 列并合并它们
【发布时间】:2021-12-29 05:01:59
【问题描述】:

我在大查询中遇到了一些问题,单列无法分成 2 列。我希望具有 8 和 10 的列索引是使用“值”列中的值称为 Universal_id 和 project_id 的新列。

我当前的表是:

user_id | index | value
a.      | 1.    | 123
b.      | 8.    | 456
c.      | 10.   | 12.60
b.      | 10.   | 789

我希望结果是这样的:

user_id | project_id | universal_id | 
a       | NA         | NA
b.      | 789        | 456
c.      | 12.60      | NA

我试过这个,但它不起作用。我搜索了很多地方,并且可以找到我正在寻找的答案。任何帮助将不胜感激。提前谢谢!!!

select user_id,
case when index = 8 then value else null end as universal_id,
case when index = 10 then value else null end as ps_project_id

from test_1

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    您可以在这里使用条件聚合:

    SELECT
        user_id,
        MAX(CASE WHEN index = 10 THEN value END) AS project_id,
        MAX(CASE WHEN index = 8  THEN value END) AS universal_id
    FROM test_1
    GROUP BY user_id;
    

    【讨论】:

    • 请问这里MAX函数的作用是什么?我知道它返回最大值,查询是否也返回不同的值?我试过没有 MAX 功能,它不起作用。我很好奇,我想知道这个查询是如何工作的。无论如何,非常感谢您的回答,它有效!
    • @FastBoi MAX 技巧的工作原理是在 index 为 8 或 10 时采用 value。对于任何 other 索引值,CASE 表达式返回被忽略的NULL
    • @Tim Biegeleisen 我明白了,所以 MAX 函数忽略了不是 8 或 10 的索引。谢谢!
    【解决方案2】:

    考虑以下方法

    select * from your_table
    pivot (
      min(value) for case index 
        when 10 then 'project_id' 
        when 8 then 'universal_id' 
      end in ('project_id', 'universal_id')
    )    
    

    如果应用于您问题中的样本数据 - 输出是

    【讨论】:

    • 此解决方案也有效。谢谢你的插话,米哈伊尔!
    猜你喜欢
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 2020-04-23
    相关资源
    最近更新 更多