2014-12-05 64 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