PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

पंक्ति कक्षों को नए स्तंभों के रूप में चुनें

यह प्रश्न बहुत कठिन था आपकी अपेक्षा से अधिक हल करने के लिए। 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;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. अतिव्यापी चर के साथ अलग-अलग तिथियों के साथ कई पंक्तियों को मिलाएं (पहली और अंतिम परिवर्तन तिथियों को पकड़ने के लिए)

  2. तालिका में उपयोगकर्ता के केवल अंतिम 5 खोज परिणाम रखें

  3. SQL:ENUM बनाम एक-से-अनेक संबंध के लाभ?

  4. PgAdmin का उपयोग करके Postgresql तालिका डेटा निर्यात करें

  5. क्या सोलर में डेटा ckan . में पोस्टग्रेज द्वारा समर्थित है?