You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在BigQuery中通过SQL实现行列转换?

BigQuery实现犯罪类型按年份的列展示统计结果

问题背景

作为BigQuery新手,我需要将按犯罪类型和年份分组统计的数据,转换为以年份为行、各犯罪类型为列的格式。

样本数据

primary_typeyear
robery2001
robery2001
robery2002
BATTERY2001
BATTERY2001
BATTERY2002

当前查询及结果

已实现分组统计的SQL:

select primary_type,
    year,
   count(*) as number_of_crime 
FROM
`bigquery-public-data`
group by primary_type, year
order by year asc;

查询结果:

primary_typeyearnumber_of_crime
robery20012
robery20021
BATTERY20012
BATTERY20021

目标结果格式

想要生成如下行列转换后的结果:

yearroberyBATTERY
200122
200211

解决方案

使用BigQuery内置的PIVOT操作可以直接实现行转列,以下是两种可行的实现方式:

方式1:基于分组统计结果转列

先通过CTE生成基础统计数据,再进行转列:

WITH crime_summary AS (
    SELECT 
        primary_type,
        year,
        COUNT(*) AS crime_count
    FROM `bigquery-public-data`
    GROUP BY primary_type, year
)
SELECT 
    year,
    robery,
    BATTERY
FROM crime_summary
PIVOT (
    SUM(crime_count)  -- 分组后每组唯一,SUM等价于直接取值
    FOR primary_type IN ('robery' AS robery, 'BATTERY' AS BATTERY)
)
ORDER BY year ASC;

方式2:直接对原表转列聚合

跳过中间统计步骤,直接在原表上完成聚合与转列:

SELECT 
    year,
    robery,
    BATTERY
FROM (
    SELECT primary_type, year 
    FROM `bigquery-public-data`
)
PIVOT (
    COUNT(*)  -- 直接统计每个年份下各犯罪类型的记录数
    FOR primary_type IN ('robery' AS robery, 'BATTERY' AS BATTERY)
)
ORDER BY year ASC;

如果后续需要新增其他犯罪类型的列,只需在IN子句中添加对应项即可,例如'THEFT' AS THEFT。

内容的提问来源于stack exchange,提问作者Abiodun Adeoye

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 05:05:16