gpt4 book ai didi

sql - 使用交叉表函数的 PostgreSQL 和数据透视表

转载 作者:行者123 更新时间:2023-11-29 12:06:34 26 4
gpt4 key购买 nike

我在使用 crosstab() 函数在 PostgreSQL 中创建数据透视表时遇到问题。它运行良好,但它会为同一个 client_id 生成多个记录。我怎样才能避免这种情况?

这是 SQL:

SELECT *
FROM crosstab('SELECT client_id
,extract(year from date)
,sum(amount)
from orders
group by extract(year from date)
,client_id'
,'SELECT extract(year from date)
FROM orders
GROUP BY extract(year from date)
order by extract(year from date)')
AS orders(
row_name integer,
year_2001 text,
year_2002 text,
year_2003 text,
year_2004 text,
year_2005 text,
year_2006 text,
year_2007 text,
year_2008 text,
year_2009 text,
year_2010 text,
year_2011 text);

//编辑

感谢 Erwin,它现在可以工作了,但我曾尝试在没有内置功能的情况下做到这一点,但没有成功。有人可以对此提出建议吗?我的代码才两年:

SELECT DISTINCT o.client_id,
CASE WHEN (extract(year from o.date)=2001)
THEN sum(o.amount) ELSE 0 END,
CASE WHEN (extract(year from o.date)=2002)
THEN sum(o.amount) ELSE 0 END
FROM orders AS o
GROUP BY 1, extract(year from o.date)
ORDER BY 1;

最佳答案

您需要 ORDER BY相应地进行第一个查询。我用 simplified syntax ORDER BY <ordinal number>在这里。

SELECT *
FROM crosstab(
'SELECT client_id
,extract(year from date)
,sum(amount)
FROM orders
GROUP BY 1,2
ORDER BY 1,2',

'SELECT extract(year from date)
FROM orders
GROUP BY 1
ORDER BY 1')
AS orders(
row_name integer,
year_2001 text,
year_2002 text,
year_2003 text,
year_2004 text,
year_2005 text,
year_2006 text,
year_2007 text,
year_2008 text,
year_2009 text,
year_2010 text,
year_2011 text);

crosstab()函数不包含在标准 PostgreSQL 中,但带有 additional module tablefunc .

编辑附加请求

没有 crosstab() 的版本功能:仅按 client_id 分组或者你最终会得到每 client_id 多行.

SELECT client_id
,sum(CASE WHEN extract(year from date) = 2001 THEN amount ELSE 0 END) AS year_2001
,sum(CASE WHEN extract(year from date) = 2002 THEN amount ELSE 0 END) AS year_2002
-- ...
FROM orders o
GROUP BY 1
ORDER BY 1;

关于sql - 使用交叉表函数的 PostgreSQL 和数据透视表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8027293/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com