如何在PostgreSQL中使用交叉表功能创建具有四列的数据透视表

时间:2019-01-24 15:52:02

标签: sql postgresql crosstab

很遗憾,我找不到关于我的问题的其他问题,所以我真的希望有人可以在这里为我提供帮助。

我正在尝试使用PostgreSQL中的交叉表功能创建数据透视表。我的问题是我只能旋转原始表中的三列。但是我需要使用四个。

该表包括四列:kgs12,Date,V4,Hach。我想计算每个kgs12和Date的每个V4类别的记录数。但是使用交叉表,我只能计算出kgs12或Date的类别。

我的桌子看起来像这样:

kgs12   Date   V4   Hach
5158020050   05.07.2016   IAB14   1
5158020050   05.07.2016   IAB14   2
5158020050   06.07.2016   IAB14   3
5158020050   06.07.2016   IAB12   4
5158020060   05.07.2016   IAB14   5
5158020060   05.07.2016   IAB12   6
5158020060   06.07.2016   IAB12   7
5158020060   06.07.2016   IAB12   8

我想要一个透视表,其外观如下:

kgs12                Date         IAB12_count       IAB14_count
05158020050       2016-07-05      null               2
05158020050       2016-07-06       1                 1
05158020060       2016-07-05       1                 1
05158020060       2016-07-06       2                null
select * from crosstab
('select  kgs12, "V4", count(*) 
from pivot_test 
group by kgs12, "V4" order by kgs12')
as 
ct(kgs12 character varying, iab12 bigint, iab14 bigint)

但是如上所述,我只能创建一个包含三列的表:

kgs12           IAB12_count  IAB14_count  
05158020050        1            3
05158020060        3            1

Date             IAB12_count  IAB14_count
2016-07-05          1              3
2016-07-06          3              1

我确信解决方案非常简单,但是我找不到任何解决方案。因此,如果有人可以在这个问题上为我提供帮助,那就太好了。

1 个答案:

答案 0 :(得分:0)

我从未使用过交叉表功能来进行数据透视,但是如果按照您所说的那样,并且将关键列限制为一列,为什么不合并进入其中的数据呢?

select * from crosstab
('select  concat(kgs12, '--', Date) as key, "V4", count(*) 
from pivot_test 
group by kgs12, Date, "V4" order by kgs12')
as 
ct(key character varying, iab12 bigint, iab14 bigint)

(或此版本:)

select * from crosstab
('select  concat(kgs12, '--', Date) as key, "V4", count(*) 
from pivot_test 
group by concat(kgs12, '--', Date), "V4" order by kgs12')
as 
ct(key character varying, iab12 bigint, iab14 bigint)

也许以后再将其分开:

select split_part(key, '--', 1), split_part(key, '--', 2), iab12_count, iab14_count from crosstab
(...)

我一直以与数据库无关的方式来完成交叉表:

select 
  kgs12,
  date,
  count(CASE WHEN "V4" = 'IAB12' THEN 1 END) as iab12_count,
  count(CASE WHEN "V4" = 'IAB14' THEN 1 END) as iab14_count
from pivot_test 
group by kgs12, date

但是它确实需要您预先为变化编码,您不能仅将其指向具有10k个不同v4值的表并自动使它产生10002列输出