2014-12-05 66 views
1

解釋我的問題與示例查詢訂單在UNNEST

select p1.zonename,p1.beatname,p1.groupname,p2.partyname,p2.amount, 
p2.groupofcompany from 
party1 p1 inner join party2 p2 on p1.txno=p2.txno 

此類似這樣的查詢顯示結果

ZoneName BeatName GroupName PartyName Amount Groupofcompany 
AA  BB   CC  A  100  Y 
AA  BB   CC  B  200  Y 
DD  EE   FF  C  300  N 

但我想這樣

AA   --> Zone Name 
    BB   --> Beat Name 
    CC   --> Group Name (if groupofcompany y then only show other wise not) 
    A  100 --> Party Name And Amount 
    B  200 
    DD 
    EE  
    C  300 

顯示於是,我試着像這樣

SELECT unnest(array[zonename,beatname,groupname,partyname]) AS partyname, 
     unnest(array[0,0,0,amount]) AS Amount, 
     unnest(array[1,2,3,4]) AS 
ORDER, 
     row_number() over() 
FROM 
    (SELECT p1.zonename, 
      p1.beatname, 
      CASE 
       WHEN p2.groupofcompany='N' THEN '' 
       ELSE p1.groupname 
      END AS groupname, 
      p2.partyname, 
      p2.amount, 
    FROM party1 p1 
    INNER JOIN party2 p2 ON p1.txno=p2.txno) AS tt 
ORDER BY row_number() over(),ORDER 

它的顯示輸出這樣

Party Name Amount Order Row_number 

     AA    1  1 
     BB    2  1 
     CC    3  1 
     A  100  4  1 
     AA    1  2 
     BB    2  2 
     CC    3  2 
     B  200  4  2 
     DD    1  3 
     EE    2  3 
        3  3 
     C  300  4  3 

但我想這樣

Party Name Amount 

     AA    
     BB    
     CC    
     A  100  
     B  200  
     DD    
     EE    
     C  300  

如何刪除重複的和正確的順序(區域名稱,beatname,組名,partyname)

上午使用Postgresql 9.3

+1

你能提供DDL和Sample Data嗎? – 2014-12-05 08:14:41

+0

謹防在選擇列表中使用unnest:http://www.mesoconcepts.com/2013/06/inconsistent-unnesting-in-postgresql/ – 2014-12-05 11:41:17

+0

@Denis。感謝doc。先生。 – Sathish 2014-12-05 12:05:25

回答

0

我不確定,但嘗試像這樣

with cte as (
      select unnest(array[zonename,beatname,groupname,partyname]) as partyname, 
        unnest(array[0,0,0,amount]) as Amount 
      from (
        select p1.zonename,p1.beatname,case when p2.groupofcompany='N' then '' else 
          p1.groupname end as groupname,p2.partyname, p2.amount 
        from party1 p1 inner join party2 p2 on p1.txno=p2.txno 
       ) t 
      ) 
select * from cte 
group by partyname,Amount 
order by (case when partyname = 'AA' then 1 
       when partyname = 'BB' then 2 
       when partyname = 'CC' then 3 
       when partyname = 'A' then 4 
       when partyname = 'B' then 5 
       when partyname = 'DD' then 6 
       when partyname = 'EE' then 7 
       when partyname = 'C' then 8 
     end) 
+0

謝謝先生寶貴的時間。但訂單不正確先生 – Sathish 2014-12-05 09:00:44

+0

謝謝先生。我解釋了樣本數據的問題。這不是我真實的數據。先生,我已經提到了問題。 – Sathish 2014-12-05 10:33:57