आपके पास "डायनेमिक" पिवट नहीं हो सकता क्योंकि किसी क्वेरी के सभी कॉलमों की संख्या, नाम और डेटा प्रकार डेटाबेस को पहले के बारे में पता होना चाहिए क्वेरी वास्तव में निष्पादित की जाती है (अर्थात पार्स समय पर)।
मुझे JSON में एकत्रित सामग्री को संभालना आसान लगता है।
select customer_number,
jsonb_object_agg(label, value) as props
from the_table
group by customer_number
अगर आपका फ्रंटएंड सीधे JSON मानों से निपट सकता है, तो आप यहां रुक सकते हैं।
यदि आपको वास्तव में प्रति विशेषता एक कॉलम के साथ एक दृश्य की आवश्यकता है, तो आप उन्हें JSON मान से प्राप्त कर सकते हैं:
select customer_number,
props ->> 'address' as address,
props ->> 'phone' as phone,
props ->> 'email' as email
from (
select customer_number,
jsonb_object_agg(label, value) as props
from the_table
group by customer_number
) t
जब नई विशेषताएँ जोड़ी जाती हैं, तो मुझे इसे प्रबंधित करना थोड़ा आसान लगता है।
यदि आपको सभी लेबल के साथ एक दृश्य की आवश्यकता है, तो आप इसे गतिशील रूप से बनाने के लिए एक संग्रहीत कार्यविधि बना सकते हैं। अगर अलग-अलग लेबल की संख्या बार-बार नहीं बदलती है, तो यह एक समाधान हो सकता है:
create procedure create_customer_view()
as
$$
declare
l_sql text;
l_columns text;
begin
select string_agg(distinct format('(props ->> %L) as %I', label, label), ', ')
into l_columns
from the_table;
l_sql :=
'create view customer_properties as
select customer_number, '||l_columns||'
from (
select customer_number, jsonb_object_agg(label, value) as props
from the_table
group by customer_number
) t';
execute l_sql;
end;
$$
language plpgsql;
फिर निम्न का उपयोग करके दृश्य बनाएं:
call create_customer_view();
और अपने कोड में बस उपयोग करें:
select *
from customer_properties;
आप उस प्रक्रिया को नियमित अंतराल में चलाने के लिए शेड्यूल कर सकते हैं (उदाहरण के लिए cron
. के माध्यम से Linux पर नौकरी)