यह प्रश्न बहुत कठिन था आपकी अपेक्षा से अधिक हल करने के लिए। crosstab()
. के साथ आपका प्रयास सही दिशा में निशाना साध रहा था। लेकिन डायनेमिक कॉलम नाम असाइन करने के लिए आपको इसके अलावा डायनेमिक SQL की आवश्यकता होती है:EXECUTE
एक plpgsql फ़ंक्शन में।
कॉलम का डेटा प्रकार बदलें infos.type
text
. से से regtype
SQL इंजेक्शन और अन्य त्रुटियों को रोकने के लिए। उदाहरण के लिए, आपके पास डेटा प्रकार number
. है , जो एक मान्य PostgreSQL डेटा प्रकार नहीं है। मैंने इसे numeric
से बदल दिया है
, तो यह काम कर सकता है।
आप कर सकते थे डबल-कोटिंग की आवश्यकता वाले कॉलम नामों से बचकर कार्य को सरल बनाएं। जैसे nume_anterior
के बजाय "nume anterior"
.
आप शायद एक कॉलम जोड़ना चाहें row_id
आपकी तालिका में info_data
एक पंक्ति के सभी तत्वों को चिह्नित करने के लिए। crosstab()
. के लिए आपको इसकी आवश्यकता है फ़ंक्शन, और यह आपको NULL
. वाले स्तंभों को अनदेखा करने की अनुमति देता है मूल्य। crosstab()
दो पैरामीटर के साथ फ़ंक्शन लापता कॉलम से निपट सकता है। मैं लापता कॉलम को अभिव्यक्ति के साथ संश्लेषित करता हूं (d.id-1)/13
नीचे - जो आपके उदाहरण में डेटा के लिए काम करता है।
आपको अतिरिक्त मॉड्यूल tablefunc इंस्टॉल करना होगा (एक बार प्रति डेटाबेस):
CREATE EXTENSION tablefunc;
इस संबंधित उत्तर में अतिरिक्त स्पष्टीकरण और लिंक खोजें ।
यह फ़ंक्शन वही करेगा जो खोज रहे हैं:
CREATE OR REPLACE FUNCTION f_mytbl()
RETURNS TABLE (id int
, nume text , prenume text , cnp numeric
, "nume anterior" text, "stare civila" text, cetatenie text
, rezidenta text , adresa text , "tip act" text
, "serie ci" text , "numar ci" text , "data eliberarii" text
, "eliberat de" text)
LANGUAGE plpgsql AS
$BODY$
BEGIN
RETURN QUERY EXECUTE $f$
SELECT *
FROM crosstab(
'SELECT (d.id-1)/13 -- AS row_id
, i.id, d.value
FROM infos i
JOIN info_data d ON d.id_info = i.id
ORDER BY 1, i.id',
'SELECT id
FROM infos
ORDER BY id'
)
AS tbl ($f$ || 'id int,
, nume text , prenume text , cnp numeric
, "nume anterior" text, "stare civila" text, cetatenie text
, rezidenta text , adresa text , "tip act" text
, "serie ci" text , "numar ci" text , "data eliberarii" text
, "eliberat de" text)';
END;
$BODY$;
कॉल करें:
SELECT * FROM x.mytbl();
नेस्टेड डॉलर-उद्धरण ।
BTW:मैंने इस कथन के साथ कॉलम सूची बनाई:
SELECT 'id int,' || string_agg(quote_ident(name) || ' ' || type
,', ' ORDER BY i.id)
FROM infos i;