postgres 中的 CROSSTAB 和 DATEPART?它有效吗?
CROSSTAB and DATEPART in postgres? Does it work?
我有一个日期格式类似于 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...
^
那么,日期部分是否与交叉表一起使用?
我会在这里简单地使用条件聚合。我发现语法更容易理解;此外,这可能是一个更有效的解决方案,特别是如果您使用正确的语法来过滤日期,即:
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
SELECT *
来自交叉表(
'SELECT sales_agent, date_part(' 'year' ', sales_date) AS yearly_sales, SUM(daily_sales)
来自 agent_sales_table
分组依据 sales_agent、yearly_sales
ORDER BY sales_agent, yearly_sales') AS source (sales_agent text, 2015 numeric, 2016 numeric);
我有一个日期格式类似于 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...
^
那么,日期部分是否与交叉表一起使用?
我会在这里简单地使用条件聚合。我发现语法更容易理解;此外,这可能是一个更有效的解决方案,特别是如果您使用正确的语法来过滤日期,即:
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
SELECT * 来自交叉表( 'SELECT sales_agent, date_part(' 'year' ', sales_date) AS yearly_sales, SUM(daily_sales) 来自 agent_sales_table 分组依据 sales_agent、yearly_sales ORDER BY sales_agent, yearly_sales') AS source (sales_agent text, 2015 numeric, 2016 numeric);