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

Sql:पंक्तियों को स्तंभों में स्थानांतरित करना

मैं MySQL के बारे में बात नहीं कर सकता, लेकिन PostgreSQL में आप से crosstab फ़ंक्शन का उपयोग कर सकते हैं। टेबलफंक मॉड्यूल:

CREATE OR REPLACE VIEW PersonAttributePivot AS
    SELECT PersonId AS ID, Age, HairColor
    FROM crosstab
    (
       'SELECT PersonId, Key, Value FROM PersonAttribute',
       'SELECT DISTINCT Key FROM PersonAttribute ORDER BY Key'
    )
    AS
    (
        PersonId integer,
        Age text,
        HairColor text
    );

क्वेरी में शामिल हों:

SELECT id, name, age, haircolor
FROM Person JOIN PersonAttributePivot USING(id)
ORDER BY id;

वांछित परिणाम:

 id |    name    | age | haircolor 
----+------------+-----+-----------
  1 | Joe Bloggs | 27  | 
  2 | Jane Doe   |     | Brown
(2 rows)

जैसा कि आप देख रहे हैं कि मैंने PersonAttributePivot . में स्तंभों की स्पष्ट सूची डाली है दृश्य। मैं निहित कॉलम सूची के साथ कोई "स्वचालित-पिवट" निर्माण तरीका नहीं जानता।

संपादित करें:

विशाल . के लिए स्तंभ सूची (हमेशा text मानकर टाइप) एक वैकल्पिक हल के रूप में मुझे ऐसा थोड़ा संशोधित दृष्टिकोण दिखाई देता है:

गतिशील प्रकार का निर्माण (यहाँ तुच्छ रूप से जावा आधारित):

Class.forName("org.postgresql.Driver");
Connection c =
        DriverManager.getConnection("jdbc:postgresql://localhost/postgres", "postgres", "12345");
Statement s = c.createStatement();
ResultSet rs = s.executeQuery("SELECT DISTINCT Key FROM PersonAttribute ORDER BY Key");
List<String> columns = new ArrayList<String>();

while (rs.next())
    columns.add(rs.getString(1));

System.out.println("CREATE TYPE PersonAttributePivotType AS (");
System.out.println("\tPersonId integer,");
for (int i = 0; i < columns.size(); ++i)
{
    System.out.print("\t" + columns.get(i) + " text");
    if (i != columns.size() - 1)
        System.out.print(",");
    System.out.println();
}
System.out.println(");");

परिणाम:

CREATE TYPE PersonAttributePivotType AS (
    PersonId integer,
    Age text,
    HairColor text
);

फ़ंक्शन रैपर:

CREATE OR REPLACE FUNCTION crosstabPersonAttribute(text, text)
    RETURNS setof PersonAttributePivotType
    AS '$libdir/tablefunc','crosstab_hash' LANGUAGE C STABLE STRICT;

स्वचालित दृश्य निर्माण:

CREATE OR REPLACE VIEW PersonAttributePivot AS
    SELECT * FROM crosstabPersonAttribute
    (
       'SELECT PersonId, Key, Value FROM PersonAttribute',
       'SELECT DISTINCT Key FROM PersonAttribute ORDER BY Key'
    );

परिणाम:

TABLE PersonAttributePivot;
 personid | age | haircolor
----------+-----+-----------
        1 | 27  |
        2 |     | Brown
(2 rows)


  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. Laravel:स्ट्रिंग डेटा, सही काट दिया गया:1406 डेटा कॉलम के लिए बहुत लंबा है

  3. Nifi PutSQL टाइमस्टैम्प/डेटाटाइम त्रुटि को परिवर्तित नहीं किया जा सकता त्रुटि

  4. फोरम पोस्ट और इस तरह के लिए 'एडिट' फंक्शन

  5. MySQL:INT को DATETIME में बदलें