BigQuery/SQL:如何使用列值作为列名? [复制]

Posted

技术标签:

【中文标题】BigQuery/SQL:如何使用列值作为列名? [复制]【英文标题】:BigQuery/SQL: How do I use a column value as column name? [duplicate] 【发布时间】:2020-04-21 05:46:47 【问题描述】:

我有这些表:

食物

| food_id | title    |
| 1       | soy milk |
| 2       | banana   |
| 3       | apple    |

营养素

| food_id | nutrient_id | amount |
| 1       | n1          | 0.05   |
| 1       | n2          | 2      |
| 1       | n3          | 34     |
...

我需要这个:

| food_id | title    | n1   | n2 | n3 |
| 1       | soy milk | 0.05 | 2  | 34 |
| 2       | banana   |      |    |    |  
| 3       | apple    |      |    |    |

列标题应该由在nutrient_id 列中找到的任何内容表示,而不是由实际字符串“n1”、“n2”等表示。例如,如果营养素 id 是“some-nutrient-123”,然后我想在结果中看到标题为“some-nutrient-123”的列。

Struct 也可以。

我知道所有的连接,但无法解决这个问题...如何将nutrient_id 放入列标题或Struct 键中?

【问题讨论】:

这可能对你有帮助***.com/questions/39394111/… 【参考方案1】:

您正在寻找如下查询:

with t1 as (
SELECT
  food_id as id_new,
  SUM(CASE WHEN nutrient_id = 'n1' THEN amount END) AS n1,
  SUM(CASE WHEN nutrient_id = 'n2' THEN amount END) AS n2,
  SUM(CASE WHEN nutrient_id = 'n3' THEN amount END) AS n3
FROM `<Nutrients>` 
GROUP BY id_new
ORDER BY id_new
)
SELECT * FROM `<Foods>` as t2 JOIN t1 
on t2.id = t1.id_new 

现在,我知道您不想硬编码营养素名称。到目前为止,我不确定在 BigQuery 中这是否可行。我的解决方法是运行例如查询

SELECT 
CONCAT(
'SUM(CASE WHEN nutrient_id = "' , nutrient_id , '" THEN amount END) AS ', nutrient_id
    )
FROM (
  SELECT nutrient_id FROM <Nutrients> GROUP BY nutrient_id ORDER BY nutrient_id
)

按照热心的link 所做的事情。这将为您提供所有需要考虑的情况。

【讨论】:

以上是关于BigQuery/SQL:如何使用列值作为列名? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何引用 BigQuery SQL 中先前行的列值,以便执行操作或计算?

在 BigQuery SQL 中:在满足日期约束时检查和更新表列值

Informix JDBC PySpark 将列名中的结果作为列值读取

选择连接表的列值作为结果列名

SQL - 以列值作为列名的聚合

将字典转换为数据框,键作为列名,键值作为数据框的列值