2014-02-21 39 views
1

我的表名是osk,st,item。 osk字段是stid,stock,free,npr,itemno。 st字段是stid,name。項目字段是id,name。我有多個架構。每個模式都有這個表像這樣將列轉換爲Postgres中的行

Name St.Name Stock FreeStock 
    A  B   10  20 
    D  B   10  10 
    C  E   12  10 

select i.name,st.name,stock,freestock from osk,st,items i where i.id=osk.itemno 
and st.stid=osk.stid 

該查詢返回的結果,但我想

Name B (stock)  B(Free) E(Stock) E (Free Stock) 
    A  10   20   -   - 
    D  10   10   -   - 
    C  -   -   12   10 

如何達致這。 (我有多個模式,所有模式都有這張表,我想從所有模式中取回)

上午使用postgresql 9.3。如果可能使用CrossTab?如何使用它?

+0

@Wolph先生我THI這在這個例子中是不同的? – Sathish

+0

@Wolph請不要鏈接到舊版本的Postgres。使用'docs/current/static'而不是'docs/8.3/static'。 –

+0

@IgorRomanchenko:哎呀,看來我想念閱讀,我認爲我們在談論的Postgres 8.3在這裏,似乎這是9.3 :) – Wolph

回答

0

假設你有一個這樣的表(猜,因爲你沒有提供確切的表定義):

create table some_table (
    name text, 
    stname text, 
    stock int, 
    freestock int 
); 

insert into some_table values 
('A', 'B', 10, 20), 
('D', 'B', 10, 10), 
('C', 'E', 12, 10); 

現在你可以使用crosstab功能這樣的記錄在這裏:http://www.postgresql.org/docs/current/static/tablefunc.html

create extension if not exists tablefunc; 

select coalesce(stock.name, freestock.name) as name, 
     stock.b as "B (stock)", 
     freestock.b as "B (free)", 
     stock.e as "E (stock)", 
     freestock.e as "E (free)" 
from 
    crosstab(' 
     select name, 
      stname, 
      stock 
     from some_table 
    ', ' 
     select distinct stname 
     from some_table 
     order by stname 
    ') as stock(name text, b int, e int) 
full outer join 
    crosstab(' 
     select name, 
      stname, 
      freestock 
     from some_table 
    ', ' 
     select distinct stname 
     from some_table 
     order by stname 
    ') as freestock(name text, b int, e int) 
on stock.name = freestock.name; 

導致:

name | B (stock) | B (free) | E (stock) | E (free) 
------+-----------+----------+-----------+---------- 
A |  10 |  20 |   | 
C |   |   |  12 |  10 
D |  10 |  10 |   | 
(3 rows) 
+0

我有一個疑問'選擇名稱, stname, 股票 從some_table''股票(名稱文字, b int,e int)'b int怎麼可能先生。因爲表中的stname是文本。 – Sathish

+0

如何爲同一個查詢運行多個模式 – Sathish

+0

@SATSON:'b int'是可能的,因爲'crosstab'會將結果拆分爲列。 你能澄清你在這裏表示多個模式的含義嗎?如果你正在討論多個postgres模式,而不是簡單地將它們添加到'search_path'或者在表名的前面。 – Wolph