So first off, I am completely new to databases and learning as I go. I have a table that comes from puppetdb in which I use postgresql as the backend. There are approximately 65 to 70 values for each certname (which can grow with custom facts) and my table looks like this:
TableName: certname_facts
certname name value
------------------------------------
node1 kernel Linux
node1 memorysize 1.96 GB
node1 osfamily Debian
node1 netmask eth0 255.255.255.0
. . .
. . .
. . .
node2 kernel Windows
node2 memorysize 2.16 GB
node2 osfamily Windows
node2 netmask eth0 255.255.255.0
. . .
. . .
. . .
I was able to create a view using this link: Automatically creating pivot table column names in PostgreSQL
create or replace function pivotcode (tablename varchar, rowc varchar, colc varchar, cellc varchar, celldatatype varchar) returns varchar language plpgsql as $$
declare
dynsql1 varchar;
dynsql2 varchar;
columnlist varchar;
begin
dynsql1 = 'select string_agg(distinct ''_''||'||colc||'||'' '||celldatatype||''','','' order by ''_''||'||colc||'||'' '||celldatatype||''') from '||tablename||';';
execute dynsql1 into columnlist;
dynsql2 = 'select * from crosstab (''select '||rowc||','||colc||','||cellc||' from '||tablename||' group by 1,2 order by 1,2'', ''select distinct '||colc||' from '||tablename||' order by 1'')
as newtable ('||rowc||' varchar,'||columnlist||');';
return dynsql2;
end
$$
--output of table
certname kernel memorysize osfamily netmask eth0 . . .
------------------------------------------------------------------------
node1 Linux 1.96 GB Debian 255.255.255.0 . . .
node2 Windows 2.16 GB Windows 255.255.255.0 . . .
The problem I am running into is that sometimes certain nodes don't have the same parameters and parameters can grow such that.
certname name value
-----------------------------------------
node1 kernel Linux
node1 memorysize 1.96 GB
node1 osfamily Debian
node1 netmask eth0 255.255.255.0
node1 location home
. . .
node2 kernel Windows
node2 memorysize 2.16 GB
node2 osfamily Windows
node2 netmask eth0 255.255.255.0
node3 kernel linux
node3 osfamily Ubuntu
node3 netmask eth0 255.255.255.0
So when i go to access the view it fails. Any suggestion on how to handle this type of situation. Is there a way to make a view completely dynamic and change based on the data. I currently looking into triggers and dynamic sql as an option.
Here is the output of the function created with it updated with a new dynsql2 statement.
select * from crosstab ('select a.certname, a.colname, b.value from ( select certname,colname from (select distinct certname) left join columns on 1=1) a left join(select certname as certname,nameas col name ,value value from certname_facts group by 1,2 ) b on a.certname = b.certname and a.colname = b.colname) a','select distinct name from certname_facts order by 1') as newtable (certname varchar,_architecture varchar,_augeasversion varchar,_clientcert varchar,_clientversion varchar,_domain varchar,_environment varchar,_facterversion varchar,_fqdn varchar,_hardwareisa varchar,_hardwaremodel varchar,_hostname varchar,_id varchar,_interfaces varchar,_ipaddress_eth0 varchar,_ipaddress_lo varchar,_ipaddress varchar,_is_virtual varchar,_kernelmajversion varchar,_kernelrelease varchar,_kernel varchar,_kernelversion varchar,_lsbdistcodename varchar,_lsbdistdescription varchar,_lsbdistid varchar,_lsbdistrelease varchar,_lsbmajdistrelease varchar,_macaddress_eth0 varchar,_macaddress varchar,_manufacturer varchar,_memoryfree varchar,_memorysize varchar,_memorytotal varchar,_netmask_eth0 varchar,_netmask_lo varchar,_netmask varchar,_network_eth0 varchar,_network_lo varchar,_operatingsystemrelease varchar,_operatingsystem varchar,_osfamily varchar,_path varchar,_physicalprocessorcount varchar,_processor0 varchar,_processorcount varchar,_productname varchar,_ps varchar,_puppetversion varchar,_rubysitedir varchar,_rubyversion varchar,_selinux varchar,_serialnumber varchar,_sshdsakey varchar,_sshecdsakey varchar,_sshrsakey varchar,_swapfree varchar,_swapsize varchar,__timestamp varchar,_timezone varchar,_type varchar,_uniqueid varchar,_uptime_days varchar,_uptime_hours varchar,_uptime_seconds varchar,_uptime varchar,_virtual varchar);