【问题标题】:SQL Transpose column, with frequencies of unique combinations as new valuesSQL Transpose 列,将唯一组合的频率作为新值
【发布时间】:2016-08-10 10:52:40
【问题描述】:

我正在尝试使用 postgresql 来汇总一些数据,并且需要生成一个频率列,然后用频率的结果转置另一列。

例如 我的起始表是这样的:

Month  | Nationality | Car
Oct-15 | GBR         | Rover
Sep-15 | FRA         | Fiat
Oct-15 | GBR         | Rover
Sep-15 | TUR         | Fiat

我想创建一个新列来计算其他列的每个唯一组合的频率。所以它会像这样:

Month  | Nationality | Car   | FREQ
Oct-15 | GBR         | Rover | 2
Sep-15 | FRA         | Fiat  | 1
Sep-15 | TUR         | Fiat  | 1

然后我想转置 Month 列,为 Month 中的每个值创建新列,并使用频率计数填充这些列的值:

 Nationality | Car    | Sep-15  |  Oct-15
 GBR         | Rover  |   0     |    2 
 FRA         | Fiat   |   1     |    0
 TUR         | Fiat   |   1     |    0

我一直在研究进行转置查询和交叉表函数,但无法弄清楚如何使用唯一组合的频率作为值来使其工作。

谢谢

【问题讨论】:

    标签: sql postgresql frequency transpose


    【解决方案1】:

    一种方法使用条件聚合:

    select nationality, car,
           sum(case when month = 'Sep-15' then 1 else 0 end) as "Sep-15",
           sum(case when month = 'Oct-15' then 1 else 0 end) as "Oct-15"
    from t
    group by nationality, car;
    

    此公式假定month 存储为字符串而不是日期。

    Postgres 确实为此提供了其他功能,例如crosstab。但是,对于您的情况,这似乎是最简单的方法。

    【讨论】:

    • 谢谢,该解决方案看起来不错。但是,我真的希望新列按日期顺序显示,因此 9 月 15 日将在 10 月 15 日之前出现,依此类推。如果我将月份列存储为字符串,它们会按字母顺序显示吗?
    • @rw2 。 . .列按它们在SELECT 中出现的顺序排列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    相关资源
    最近更新 更多