我有一张表格,其中列出了每种产品,年份和交易类型的贸易交易摘要。该表有几百万行。有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
另外,我有一个包含所有不同类型交易的小桌子。由于有21种不同的类型,它只有21行。请看下面几个示例行:
select * from tran_types limit 5;
tran_type
-----------
WZE
WKE
PWInne
FZ
ZS
我可以通过简单的查询计算给定事务类型中所有事务的总值。以下是交易类型'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 | | |
同样,我可以通过简单的查询计算给定事务类型内所有事务的总值。以下是交易类型'WZE'的示例:
select sum(wze) from cross_view;
sum
------------
8222568.52
对于18种类型的交易,我得到100%正确的数字。 但是,对于其他3种类型,该数字完全关闭。其中一种交易类型是'WZE'。正如您所看到的,“事务”表上的查询结果与“cross_view”表上的查询结果非常不同。
我不知道这种差异可能来自何处
我尝试改变数据类型 - 没有改进
我回顾了几十笔交易 - “WZE”交易与任何其他类型交易之间似乎没有明显区别。没有'null'值,空记录,奇怪格式等。
我创建了一个新表,只包含'交叉表'查询的第一个组件:
create table test as select year_product, tran_type, value from transactions order by 1
它提供适当的交易价值。因此,用于创建“交叉视图”表的查询似乎没有明显的错误。
你知道这个问题的来源吗?
提前谢谢。
答案 0 :(得分:0)
是的,我做到了。 我必须添加“ 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**
我已用粗体标记了我对初始版本所做的更改。