Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Sql:Chuyển các hàng thành cột

Tôi không thể nói về MySQL, nhưng trong PostgreSQL, bạn có thể sử dụng hàm crosstab từ tablefunc mô-đun:

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
    );

Tham gia truy vấn:

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

Kết quả mong muốn:

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

Như bạn thấy, tôi đặt danh sách cột rõ ràng trong PersonAttributePivot lượt xem. Tôi không biết bất kỳ cách tạo "xoay vòng tự động" nào với danh sách cột ngầm định.

CHỈNH SỬA:

Đối với rất lớn danh sách cột (giả sử luôn là text type) như một cách giải quyết, tôi thấy cách tiếp cận được sửa đổi nhỏ như vậy:

Tạo kiểu động (ở đây thông thường dựa trên Java):

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(");");

Kết quả:

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

Trình bao bọc hàm:

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

Tạo chế độ xem tự động:

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

Kết quả:

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. Laravel 5.1 - Kết nối MySQL Homestead. `Kết nối bị Từ chối` &` Không có tệp hoặc thư mục nào như vậy`

  2. Trong khi nhập tệp mysqldump LỖI 1064 (42000) gần '■ /' tại dòng 1

  3. Lỗi ASP.NET/Identity:Loại thực thể ApplicationUser không phải là một phần của mô hình cho ngữ cảnh hiện tại

  4. truyền một chuỗi thành thời gian sql

  5. Tính toán kích thước cơ sở dữ liệu?