gpt4 book ai didi

sql - Postgresql 交叉表查询从其组件查询生成不同的结果

转载 作者:行者123 更新时间:2023-11-29 12:24:21 25 4
gpt4 key购买 nike

我有一张表格,其中包含每种产品、年份和交易类型的贸易交易摘要。该表有几百万行。有 21 种不同的交易类型和约 20,000 种不同的产品。请查看下面的一些示例行:

select * from transactions limit 5;
tran_type | product | value | currency | year | year_product
-----------+---------+---------+----------+------+--------------
PA | OKNA | 1545.27 | PLN | 2016 | OKNA|2016
PZ | ROLKA | 1701.00 | PLN | 2016 | ROLKA|2016
FS | OKNA | 1178.86 | PLN | 2017 | OKNA|2017
FS | ALUCYNK | 1485.00 | PLN | 2015 | ALUCYNK|2015
FSK | ALUCYNK | -105.00 | PLN | 2015 | ALUCYNK|2015

此外,我还有一张小 table ,上面有所有不同类型的交易。由于有 21 种不同的类型,它只有 21 行。请查看下面的一些示例行:

select * from tran_types limit 5;
tran_type
-----------
WZE
WKE
PWInne
FZ
ZS

我可以通过一个简单的查询来计算给定交易类型中所有交易的总值(value)。下面是交易类型“WZE”的示例:

select sum(value) from transactions where tran_type = 'WZE';
sum
-------------
13515564.02

这样的查询为所有类型的交易提供了正确的结果。我想创建一个表,其中每个 year_product 都有自己的行,同时有一列包含每种交易类型的交易值。我运行以下查询:

create table cross_view 
as select * from crosstab
('select
year_product, tran_type, value from transactions order by 1',
'select
tran_type from tran_types')
as
(year_product text,
wze numeric(12,2),
wke numeric(12,2),
pw_other numeric(12,2),
fz numeric(12,2),
zs numeric(12,2),
mmp numeric(12,2),
pzi numeric(12,2),
wzk numeric(12,2),
fs numeric(12,2),
zz numeric(12,2),
rw_prod numeric(12,2),
mmw numeric(12,2),
pak numeric(12,2),
pw_prod numeric(12,2),
rw_other numeric(12,2),
pz numeric(12,2),
wz numeric(12,2),
pa numeric(12,2),
pzk numeric(12,2),
pwk_other numeric(12,2),
fsk numeric(12,2));

其中 wze、wke、...、fsk 是不同的交易类型。

结果表与我预期的一样。请在下面找到一些示例行:

select * from cross_view limit 3;
year_product | wze | wke | pw_other | fz | zs | mmp | pzi | wzk | fs | zz | rw_prod | mmw | pak | pw_prod | rw_other | pz | wz | pa | pzk | pwk_other | fsk
--------------+-----+-----+---------+----+----------+---------+-----+-----+---------+----+---------+---------+-----+---------+---------+---------+---------+---------+-----+----------+---------
ALUCYNK|2015 | | | | | 5447.50 | 1049.45 | | | 1485.00 | | | 1049.38 | | | | 9613.05 | 8840.50 | 646.21 | | | -105.00
ALUCYNK|2016 | | | | | 11807.30 | | | | 671.05 | | | | | | 30.62 | 9334.53 | 9510.25 | 2617.78 | | |
ALUCYNK|2017 | | | | | 798.85 | 1999.28 | | | 945.00 | | | 1999.28 | | | | 2686.08 | 1954.00 | 146.85 | | |

同样,我可以通过一个简单的查询来计算给定交易类型中所有交易的总值(value)。下面是交易类型“WZE”的示例:

select sum(wze) from cross_view;
sum
------------
8222568.52

对于 18 种交易,我得到 100% 正确的数字。然而,对于其他 3 种类型,该数字完全不存在。其中一种交易类型是“WZE”。如您所见,“transactions”表的查询结果与“cross_view”表的查询结果大不相同。

我不知道这种差异从何而来。
我尝试更改数据类型 - 没有任何改进。
我审查了数十笔交易——“WZE”交易与任何其他类型之间似乎没有明显区别。没有“空”值、空记录、奇怪的格式等。
我创建了一个只有“交叉表”查询的第一个组件的新表:

create table test as select year_product, tran_type, value from transactions order by 1

它给出了正确的交易值(value)。因此,用于创建“交叉 View ”表的查询似乎没有明显的错误。

你知道这个问题是从哪里来的吗?

提前谢谢你。

最佳答案

是的,我做到了。我必须添加“tran_type”的连贯排序:

create table cross_view 
as select * from crosstab
('select
year_product, tran_type, value from transactions order by 1' **asc**,
'select
tran_type from tran_types' **order by tran_type asc**)
as
**year_product, tran_type, value**

我已经用粗体标记了我从初始版本中所做的更改。

关于sql - Postgresql 交叉表查询从其组件查询生成不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49096164/

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