有没有办法使用案例自动将 SQL 行转换为列?

小工具213

我在Bigquery 上使用 usa_names 数据集,为了能够可视化 1910 年到 2020 年之间的前 10 个名称,我必须按年份分组并使用 CASE 为 10 个名称中的每一个创建一个新列。

问题是,我想可视化前 100 名,并且我想知道是否有一种方法可以自动化 CASE,因为我不必为每个名称编写“WHEN 和 THEN 子句”以便为他们创建一个专栏。

我不得不使用下面的 SQL 查询代码首先获得前 10 个名称;

SELECT
  name,
  SUM(number) AS total
FROM
  bigquery-public-data.usa_names.usa_1910_current
WHERE
  year BETWEEN 1910 AND 2020
GROUP BY
  name
ORDER BY
  total DESC
LIMIT
  10

然后使用以下代码将每个名称行转换为列;

SELECT
  year,
  SUM(CASE WHEN name = 'James' THEN number ELSE 0 END) AS James,
  SUM(CASE WHEN name = 'John' THEN number ELSE 0 END) AS John,
  SUM(CASE WHEN name = 'Robert' THEN number ELSE 0 END) AS Robert,
  SUM(CASE WHEN name = 'Michael' THEN number ELSE 0 END) AS Michael,
  SUM(CASE WHEN name = 'William' THEN number ELSE 0 END) AS William,
  SUM(CASE WHEN name = 'Mary' THEN number ELSE 0 END) AS Mary,
  SUM(CASE WHEN name = 'Richard' THEN number ELSE 0 END) AS Richard,
  SUM(CASE WHEN name = 'Joseph' THEN number ELSE 0 END) AS Joseph,
  SUM(CASE WHEN name = 'Charles' THEN number ELSE 0 END) AS Charles,
  SUM(CASE WHEN name = 'Thomas' THEN number ELSE 0 END) AS Thomas
FROM
  bigquery-public-data.usa_names.usa_1910_current
GROUP BY
  year
ORDER BY
  year

我想获得相同的结果,而不必先提取名称并手动将它们输入到 CASE 语句中。

此外,如果有一种方法可以直接可视化数据而无需将名称从行转换为列,则不需要这样做。

谢谢。

大卫考克斯88

您不需要为每个名称创建一列。您的第一个查询就足够了(显然只需将限制更改为 100)。根据我假设您使用 Tableau 的问题标签,因此它就像选择所需的可视化(例如条形图)并将名称放在一个轴上并在另一个轴上总计一样简单。

根据您的后续评论,它看起来像这样

SELECT
name,
year,
SUM(number) AS total
From bigquery-public-data.usa_names.usa_1910_current
WHERE name IN
(
SELECT name
FROM
(
SELECT
  name,
  SUM(number) AS total
FROM
  bigquery-public-data.usa_names.usa_1910_current
WHERE
  year BETWEEN 1910 AND 2020
GROUP BY
  name
ORDER BY
  total DESC
LIMIT
  100
))
GROUP BY name, year

您还可以考虑使用 Tableau 中的计算字段来确定原始数据以实现所需的可视化。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章