2012-05-16 38 views
5

tôi có một cái nhìn mà trông như thế nàytiêu đề cột transpose để hàng trong postgresql

  value1count  value2count value3count 
      ---------------------------------------- 
      25    35   55 

tôi cần phải transpose tiêu đề cột thành hàng và vì vậy tôi cần nó để trông giống như

  Values    Count 
     ----------------------------- 
      value1count   25 
      value2count   35 
      value3count   55 

tôi có thể làm điều này bằng cách chọn các tên cột riêng lẻ làm cột đầu tiên và dữ liệu làm cột thứ hai và sau đó thực hiện một liên kết giống nhau cho tất cả các cột.

Có cách nào tốt hơn để thực hiện việc này không? Tôi đang sử dụng PosgreSQL 8.1 và do đó không có các toán tử trục xoay để làm việc cùng.

Cảm ơn bạn đã trả lời trước.

+0

vâng chúng tôi đang nâng cấp lên mới nhất version..probably vào cuối mùa hè .... Cảm ơn – cableload

+0

Cột như thế (và các câu hỏi như thế) thường chỉ ra một thiết kế sai lầm. Bạn đề cập đến một VIEW tham gia vì vậy nó có thể không phải là trường hợp với các bảng của bạn. Nhưng hãy xem xét một thiết kế lại nếu xem đó phản ánh cấu trúc bảng thực tế –

Trả lời

22

Crosstab chỉ làm ngược lại những gì bạn cần, nhưng điều này sẽ giúp bạn:

Đầu tiên tạo unnest() chức năng được bao gồm trong 8.4, xem here để được hướng dẫn.

Sau đó, bạn có thể làm điều này (dựa trên this bưu điện):

SELECT 
    unnest(array['value1Count', 'value2Count', 'value3Count']) AS "Values", 
    unnest(array[value1Count, value2Count, value3Count]) AS "Count" 
FROM view_name 
ORDER BY "Values" 

tôi có thể xác minh rằng công trình này trong 8.4, nhưng vì tôi không có 8.1, tôi không thể hứa hẹn nó sẽ làm việc tương tự.

+2

Điều này là rực rỡ .. làm việc tốt trong 8.1 .. truy vấn công đoàn của tôi mất 10 giây và truy vấn không cần thiết này chỉ mất 3 giây .. Cảm ơn rất nhiều PinnyM. – cableload

5

tôi đã đạt được mục tiêu của bạn bằng cách sử dụng hstore 's chức năng:

SELECT (x).key, (x).value 
FROM 
    (SELECT EACH(hstore(t)) as x 
    FROM t 
) q; 

bạn có thể có nhiều hàng trong bạn 'to-be-phát nổ' xem hoặc bảng (gọi đây là t), bạn có thể cần phải chèn một định thêm vào một số trong bảng trung gian q, ví dụ:

SELECT id, (x).key, (x).value 
FROM 
    (SELECT id, EACH(hstore(t)) as x 
    FROM t 
) q; 

tham khảo: hstore documentation

+0

+1, Lợi thế ở đây là tránh sự cần thiết phải đặt tên cho các cột trong truy vấn của bạn. Rõ ràng [nó không thực hiện khá tốt cũng như không cần thiết] (http://www.postgresonline.com/journal/archives/283-Unpivoting-data-in-PostgreSQL.html), nhưng không đến một mức độ đáng kể. – PinnyM

+0

Đây là một giải pháp tuyệt vời, cảm ơn bạn! Vấn đề duy nhất là thứ tự cột bị rối tung lên. Bạn có bất kỳ ý tưởng làm thế nào để làm việc xung quanh đó? – David

3

Tôi đang tìm cách làm một cái gì đó tương tự như thế này để dễ dàng xử lý thông tin bảng từ một tập lệnh bash. Hóa ra là rất dễ dàng để kể psql để hiển thị các cột bảng như hàng:

psql mydbname -x -A -F= -c "select * from blah where id=123" 
  • Các -x là những gì xoay đầu ra.
  • -A xóa khoảng trắng thừa.
  • -F= thay thế | bằng = giữa tên cột và giá trị.

Điều này tất nhiên sẽ không hoạt động trong SQL, nó chỉ sửa đổi cách psql xảy ra với đầu ra định dạng.

0

Tôi có tình huống tương tự. Tôi bọc truy vấn của tôi trong một tuyên bố với và sau đó đã làm một bó của UNION ALL s cho mỗi hàng. Trong trường hợp của tôi, nếu tôi có nhiều bản ghi, ncm_id sẽ khác nhau, vì vậy tôi đã tiếp tục và thêm vào danh sách cột trong tập kết quả của tôi. Đây có thể không phải là cách tốt nhất để làm điều này, nhưng nó làm việc cho trường hợp sử dụng của tôi.

WITH query_a AS (
    SELECT 
     fin_item.item_number || ' - ' || fin_item.item_descrip1 fin_item, 
     fin_ls.ls_number, 
     ls_sort.sortby_employeeid, 
     ls_sort.ncm_id, 
     ls_sort.created_at, 
     ls_sort.updated_at, 
     ls_sort.sort_qty, 
     ls_sort.initial_scan_time, 
     ls_sort.ncm_scan_time, 
     ls_sort.badge_scan_time, 
     ls_sort.computer_name, 
     ls_sort.number_of_ops, 
     ls_sort.ncm_item_scan_time, 
     sort_by.name sort_by, 
     tblncm.instructions, 
     tblncm.ncm_comments 
    FROM public.item AS fin_item 
     INNER JOIN public.ls AS fin_ls ON fin_item.item_id = fin_ls.ls_item_id 
     INNER JOIN stone.ls_sort ON fin_ls.ls_id = ls_sort.ls_id 
     INNER JOIN stone.vw_mssql_employees AS sort_by ON ls_sort.sortby_employeeid = sort_by.employeeid 
     INNER JOIN stone.tblncm ON ls_sort.ncm_id = tblncm.ncm_id 
     LEFT JOIN stone.equips AS mach_equips ON ls_sort.mach_equip_id = mach_equips.id 
     LEFT JOIN stone.equips AS mold_equips ON ls_sort.mold_equip_id = mold_equips.id 
    WHERE 1 = 1 
      AND fin_ls.ls_number ILIKE 'S143027526190' || '%' 
) 
    SELECT * 
    FROM (
    (SELECT 'fin_item' my_column, fin_item::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a) 
     UNION ALL 
    (SELECT 'ls_number' my_column, ls_number::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a) 
     UNION ALL 
    (SELECT 'sortby_employeeid' my_column, sortby_employeeid::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a) 
     UNION ALL 
    (SELECT 'ncm_id' my_column, ncm_id::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a) 
     UNION ALL 
    (SELECT 'created_at' my_column, created_at::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a) 
     UNION ALL 
    (SELECT 'updated_at' my_column, updated_at::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a) 
     UNION ALL 
    (SELECT 'sort_qty' my_column, sort_qty::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a) 
     UNION ALL 
    (SELECT 'initial_scan_time' my_column, initial_scan_time::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a) 
     UNION ALL 
    (SELECT 'ncm_scan_time' my_column, ncm_scan_time::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a) 
     UNION ALL 
    (SELECT 'badge_scan_time' my_column, badge_scan_time::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a) 
     UNION ALL 
    (SELECT 'computer_name' my_column, computer_name::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a) 
     UNION ALL 
    (SELECT 'number_of_ops' my_column, number_of_ops::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a) 
     UNION ALL 
    (SELECT 'ncm_item_scan_time' my_column, ncm_item_scan_time::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a) 
     UNION ALL 
    (SELECT 'sort_by' my_column, sort_by::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a) 
     UNION ALL 
    (SELECT 'instructions' my_column, instructions::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a) 
     UNION ALL 
    (SELECT 'ncm_comments' my_column, ncm_comments::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a) 
    ) as query_guy 
ORDER BY my_ncm; 
Các vấn đề liên quan