2011-09-27 38 views
10

Tôi mới sử dụng PostgreSQL.Cách thực hiện xoay vòng trong PostgreSQL

Giả sử tôi có một bảng như dưới

colorname Hexa rgb rgbvalue 
Violet #8B00FF r 139 
Violet #8B00FF g 0 
Violet #8B00FF b 255 
Indigo #4B0082 r 75 
Indigo #4B0082 g 0 
Indigo #4B0082 b 130 
Blue #0000FF r 0 
Blue #0000FF g 0 
Blue #0000FF b 255 

Nếu tôi làm một Pivot trong SQL Server như

SELECT colorname,hexa,[r], [g], [b] 
FROM 
(SELECT colorname,hexa,rgb,rgbvalue 
    FROM tblPivot) AS TableToBePivoted 
PIVOT 
(
sum(rgbvalue) 
FOR rgb IN ([r], [g], [b]) 
) AS PivotedTable; 

tôi nhận được đầu ra như

colorname hexa r g b 
Blue #0000FF 0 0 255 
Indigo #4B0082 75 0 130 
Violet #8B00FF 139 0 255 

Làm thế nào để làm cùng sử dụng PostgreSQL?

nỗ lực của tôi là

SELECT * 
FROM crosstab 
(
    'SELECT 
     colorname 
     ,hexa 
     ,rgb 
     ,rgbvalue 
    FROM tblPivot' 
)AS ct(colorname text, hexa text, rgb text, rgbvalue int); 

Nhưng geting lỗi:

ERROR: function crosstab(unknown) does not exist 
LINE 2: FROM crosstab 
      ^
HINT: No function matches the given name and argument types. You might need to add explicit type casts. 
********** Error ********** 
ERROR: function crosstab(unknown) does not exist** 

Có cách nào tao nhã của làm như vậy trong PostgreSQL (bất kỳ xây dựng trong chức năng ...) thực hành tiêu chuẩn là gì làm như vậy ?

Trả lời

5

This can be expressed as a JOIN:

SELECT c.colorname, c.hexa, r.rgbvalue, g.rgbvalue, b.rgbvalue 
FROM (SELECT colorname, hexa 
     FROM sometable 
     GROUP BY colorname) c 
JOIN sometable r ON c.colorname = r.colorname AND r.rgb = 'r' 
JOIN sometable g ON c.colorname = g.colorname AND g.rgb = 'g' 
JOIN sometable b ON c.colorname = b.colorname AND b.rgb = 'b' 
; 
+0

But why crosstab didnot work ... does it not support in phiên bản hiện tại mà tôi đang sử dụng? –

+4

'crosstab()' thuộc về mô-đun 'tablefunc'. Bạn sẽ phải kích hoạt nó bằng 'CREATE EXTENSION'. Mà nói; sự tiện lợi mà nó cung cấp có thể không tuyệt vời như vậy; postgresql là tuyệt vời tốt tại tối ưu hóa tham gia, và loại mã này sẽ dễ nhận biết hơn trên cơ sở dữ liệu nhiều hơn và nhiều nhà phát triển hơn. – SingleNegationElimination

+0

Nếu bạn làm rất nhiều công cụ crosstab, các mô-đun contf tablefunc có thể là tuyệt vời. Nếu bạn đang sử dụng Ubuntu, bạn có thể thêm các hàm tablefunc vào một db bằng cách làm như sau: psql dbname -f /usr/share/postgresql/8.4/contrib/tablefunc.sql hoặc một cái gì đó tương tự. –

32

Run this

CREATE EXTENSION tablefunc; 

và try to execute query your

+2

nếu tôi chạy điều này tôi nhận được 'LRI: mở rộng" tablefunc "đã tồn tại' nhưng khi tôi cố gắng sử dụng nó tôi nhận được' LRI: chức năng crosstab (chưa biết) không tồn tại'. Tôi đang sử dụng Postgres 9.2.1 trên Mac 10.9.2. Bất kỳ ý tưởng? – Black

+2

Đảm bảo rằng bạn được kết nối với cơ sở dữ liệu của bạn với \ c db_name và sau đó chạy lệnh trên. – sm0ke21

+1

Câu trả lời này (https://stackoverflow.com/a/23073241/177116) có câu trả lời cho câu hỏi được đưa ra trong nhận xét của @ Black. –

Các vấn đề liên quan