Often, we store data in a normalized way in our database, perhaps something that resembles key-value pairs. To illustrate, let us see the following table, which describes properties of computers.
select comp_id, comp_property, comp_property_value from schema1.comp_properties; COMP_ID COMP_PROPERTY COMP_PROPERTY_VALUE ------- ------------- ------------------- 1 hostname comp1 1 ipaddress 192.168.0.1 1 os Windows XP SP2 1 hdd1 60gb 1 hdd2 500gb 2 hostname comp2 2 ipaddress 192.168.0.2 2 os MacOS 10.5 2 hdd1 80gb 3 hostname comp3 3 os Ubuntu Linux 7.10
In this particular case, we can see that the three computers have different properties. While in this example of three computers we can see the information easily, we can also imagine that it will become cumbersome if we are managing 100 computers instead of only three. Thus, a pivot table type of presentation would be much more useful.
To rewrite the SQL statement to present the same data in a pivot table manner, we can do the following.
create or replace schema1.v_comp_properties select comp_id, hostname, ipaddress, os, hdd1, hdd2 from ( select comp_id, max(case when comp_property='hostname' then comp_property_value else null end) as hostname, max(case when comp_property='ipaddress' then comp_property_value else null end) as ipaddress, max(case when comp_property='os' then comp_property_value else null end) as os, max(case when comp_property='hdd1' then comp_property_value else null end) as hdd1, max(case when comp_property='hdd2' then comp_property_value else null end) as hdd2 from schema1.comp_properties group by comp_id );
The result should look like the following.
select comp_id, hostname, ipaddress, os, hdd1, hdd2 from schema1.v_comp_properties; COMP_ID HOSTNAME IPADDRESS OS HDD1 HDD2 ------- -------- ----------- ----------------- ---- ----- 1 comp1 192.168.0.1 Windows XP SP2 60gb 500gb 2 comp2 192.168.0.2 MacOS 10.5 80gb 3 comp3 192.168.0.3 Ubuntu Linux 7.10
With this pivot table, we will be able to see all properties of each computer on each row easily, while still maintain a normalized database design.