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

时间:2018-03-04 13:52:34

标签: 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

另外,我有一个包含所有不同类型交易的小桌子。由于有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

它提供适当的交易价值。因此,用于创建“交叉视图”表的查询似乎没有明显的错误。

你知道这个问题的来源吗?

提前谢谢。

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**

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