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

标签 sql postgresql crosstab

我有一张表格,其中包含每种产品、年份和交易类型的贸易交易摘要。该表有几百万行。有 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/

相关文章:

sql - 使用键作为列将主表数据与另一个表中的键值属性连接起来

php - Codeigniter MYSQL 数据减去 date2 中的 date1 数据

sql - 选择与特定记录相关但没有其他记录相关的记录

mysql - 将值从一行移动到另一行?

python - Django 1.5 : OperationalError in windows when running "python manage.py syncdb" using postgresql-psycopg2

r - 在 R 中的表中添加一行,其中每一列的总和

mysql - 为什么这个存储不返回结果

java - jOOQ - 如何将列和表传递给函数?

php - laravel(lumen) 查询中的 Postgis ST_DWithin 函数

python - Pandas crosstab - 如何为数据集中不存在的值打印行/列?