【问题标题】:CROSSTAB and DATEPART in postgres? Does it work?postgres 中的 CROSSTAB 和 DATEPART?它有效吗?
【发布时间】:2020-05-03 17:31:15
【问题描述】:

我有一个日期格式为 2015-02-19 的列,我试图将年份拉出并将年份作为单独的列来显示该年度的总销售额。我的源查询运行良好,但在尝试运行完整查询时,出现 yearly_sales 语法错误

SELECT *
FROM CROSSTAB(
    'SELECT sales_agent, date_part('year', sales_date) AS yearly_sales, SUM(daily_sales)
     FROM agent_sales_table
     GROUP BY sales_agent, yearly_sales
     ORDER BY sales_agent, yearly_sales') AS source (sales_agent text, 2015 numeric, 2016 numeric);
ERROR:  syntax error at or near "year"
LINE 3:  'SELECT sales_agent, date_part('year', sales_date) AS yearly_sales, SUM(daily_s...
                                         ^

那么,datepart 是否适用于交叉表?

【问题讨论】:

    标签: postgresql date group-by pivot crosstab


    【解决方案1】:

    我会在这里简单地使用条件聚合。我发现语法更容易理解;此外,这可能是一个更有效的解决方案,特别是如果您使用正确的语法来过滤日期,即:

    select
        sales_agent,
        sum(daily_sales) filter(where sales_date >= date '2015-01-01' and sales_date < date '2016-01-01') sales_2015
        sum(daily_sales) filter(where sales_date >= date '2016-01-01' and sales_date < date '2017-01-01') sales_2016
    from mytable
    group by sales_agent
    

    此查询可能会利用sales_agent, sales_date) 上的索引。

    您可以轻松扩展select 子句以处理更多年份。添加where 子句以限制行更早地聚合可能也是一个好主意。事实上,如果你只想要 2015 和 2016,查询可以写成:

    select
        sales_agent,
        sum(daily_sales) filter(where sales_date <  date '2016-01-01') sales_2015
        sum(daily_sales) filter(where sales_date >= date '2016-01-01') sales_2016
    from mytable
    where sales_date >= date '2015-01-01' and sales_date < date '2017-01-01'
    group by sales_agent
    

    【讨论】:

      【解决方案2】:

      选择 * 来自 CROSSTAB( 'SELECT sales_agent, date_part(' 'year' ', sales_date) AS yearly_sales, SUM(daily_sales) FROM agent_sales_table GROUP BY sales_agent, yearly_sales ORDER BY sales_agent, yearly_sales') 作为来源(sales_agent 文本,2015 年数字,2016 年数字);

      【讨论】:

      • 只使用两个单引号而不使用双引号
      猜你喜欢
      • 2021-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-07
      • 1970-01-01
      • 2011-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多