【问题标题】:Pivot aggregates in SQLSQL 中的透视聚合
【发布时间】:2021-05-30 17:24:59
【问题描述】:

我正在尝试找到一种方法将下表(我猜您会说它是“长”格式)转换为(“更宽”)格式,其中所有列基本上都是明确的布尔值。我希望这个简单的例子能理解我想要做的事情。

注意大约有 74 人。(所以输出表将有 223 列,1 + 74 x 3)

我想不出一个简单的方法来做到这一点,除了可怕地通过像

这样的语句沿着“Town”进行大量左连接
... left join(
select 
   town, 
   case where person = 'Richard' then 1 else 0 end as "Richard"
   Fee as "Richard Fee"
from services 
where person = 'Richard'
left join...

能否有聪明人提出一种在 SQL 中使用 PIVOT 函数的方法? 我正在使用 Snowflake(和 dbt,所以如果真的需要循环遍历所有人,我可以让一些 jinja 发挥作用)。

输入:

期望的输出:

ps。我知道这是一个荒谬的 SQL 问题,但这是“客户想要的输出”,所以我有这个不受欢迎的任务要完成。

【问题讨论】:

标签: sql snowflake-cloud-data-platform


【解决方案1】:

如果事先知道人员,那么您可以使用条件聚合:

SELECT town,
       MAX(CASE WHEN person = 'Richard' THEN 1 ELSE 0 END)  AS "Richard",
       MAX(CASE WHEN person = 'Richard' THEN Fee END)       AS "Richard Fee",
       MAX(CASE WHEN person = 'Richard' THEN Service END)   AS "Richard Service",
       MAX(CASE WHEN person = 'Caitlin' THEN 1 ELSE 0 END)  AS "Caitlin",
       ...
FROM services 
GROUP BY town;

【讨论】:

  • Max 在做什么——尤其是当它是像 Service 这样的字符串时?
  • @ChristopherTurnbull 当您使用GROUP BY town 时,其他列必须用 agg 函数包装。每个城镇的值为 NULL 或特定人员的值,MAX 允许获取特定值
  • 这是我缺少的聪明的东西。惊人的。 4D 国际象棋就在那里移动。谢谢队友
  • 当我在 dbt 中运行它时,我收到以下关于 MAX 服务器错误的错误:rpc 请求中的数据库错误(来自远程系统)100038(22018):无法识别数值“fwa”你知道有没有类似的stings?
  • @ChristopherTurnbull 使用 CASE 时,所有部分都应该是相似的数据类型。似乎您有类似 MAX(CASE WHEN ... THEN 1 ELSE col_name END) 的内容,并且隐式转换为 numeric(value "fwa") 失败。
猜你喜欢
  • 1970-01-01
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多