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

如何在BigQuery SQL中按学校列出球员姓名并排除空值

解决NFL球员按大学分组展示的SQL查询问题

你的核心需求是按大学分组展示对应的NFL球员,同时移除大学为空的记录,但当前的Pivot写法方向不对——Pivot是把行转成列(比如把每个大学变成单独的列),而你要的是一行对应一个大学,列里列出该大学的所有球员。

问题出在哪?

你原代码里的子查询同时按collegeName和displayName分组,相当于每个球员单独成一行,完全没起到聚合的作用;后续的Pivot操作只是把指定几所大学转成列,这和“按学校展示球员”的需求不符。

正确的写法(分数据库)

首先第一步统一要做的:用WHERE collegeName IS NOT NULL过滤掉大学为空的记录,然后按大学分组,把同校的球员名字聚合起来。不同数据库的聚合函数略有不同:

MySQL

SELECT
  collegeName,
  GROUP_CONCAT(DISTINCT displayName SEPARATOR ', ') AS players
FROM NFL.Players
WHERE collegeName IS NOT NULL
GROUP BY collegeName
ORDER BY collegeName;

SQL Server

SELECT
  collegeName,
  STRING_AGG(DISTINCT displayName, ', ') WITHIN GROUP (ORDER BY displayName) AS players
FROM NFL.Players
WHERE collegeName IS NOT NULL
GROUP BY collegeName
ORDER BY collegeName;

BigQuery/PostgreSQL

如果想要数组格式的球员列表:

SELECT
  collegeName,
  ARRAY_AGG(DISTINCT displayName ORDER BY displayName) AS players
FROM NFL.Players
WHERE collegeName IS NOT NULL
GROUP BY collegeName
ORDER BY collegeName;

如果想要字符串拼接的格式(PostgreSQL可用):

SELECT
  collegeName,
  STRING_AGG(DISTINCT displayName, ', ' ORDER BY displayName) AS players
FROM NFL.Players
WHERE collegeName IS NOT NULL
GROUP BY collegeName
ORDER BY collegeName;

如果你确实需要用Pivot(行转列)

如果你的需求是把指定大学作为列,每列显示该大学的球员(比如一行展示多所大学的球员),那修正后的代码可以这样写(以BigQuery为例):

SELECT *
FROM (
  SELECT collegeName, displayName
  FROM NFL.Players
  WHERE collegeName IS NOT NULL
    AND collegeName IN ('Kansas State','Abilene Christian','Texas Tech')
)
PIVOT (
  STRING_AGG(displayName, ', ') AS players
  FOR collegeName IN ('Kansas State','Abilene Christian','Texas Tech')
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 23:20:05