很遗憾,我找不到关于我的问题的其他问题,所以我真的希望有人可以在这里为我提供帮助。
我正在尝试使用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
我确信解决方案非常简单,但是我找不到任何解决方案。因此,如果有人可以在这个问题上为我提供帮助,那就太好了。
答案 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列输出