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 中:在满足日期约束时检查和更新表列值