2013-02-12 33 views
3
WITH Dept(DName) AS (
    VALUES ('D1'), ('D2'), ('D3') 
) , 
Emp(DName, EName, Age, Loc) AS (
    VALUES ('D1','E11',20,'L1'), ('D1','E12',25,'L2'),('D2','E21',28,'L1') 
) 
SELECT DName, 

    (SELECT avg(Age) 
    FROM Emp 
    WHERE Loc = 'L1' 
    AND DName = d.DName) AS "L1 Avg", 

    (SELECT avg(Age) 
    FROM Emp 
    WHERE Loc = 'L2' 
    AND DName = d.DName) AS "L2 Avg" 
FROM Dept d 
LEFT JOIN Emp USING (DName) 
GROUP BY DName 

刪除子查詢這個查詢的輸出是:在PostgreSQL

"D1";20.0000000000000000;25.0000000000000000 
"D2";28.0000000000000000; 
"D3";; 

有沒有辦法通過刪除子查詢重構查詢與和PostgreSQL中更好地構建更換呢?

+0

Pg version?感謝您在查詢中包含示例數據作爲CTE表達式。 – 2013-02-12 07:45:20

+0

Pg版本是9.2。 – Gopal 2013-02-12 08:39:31

+0

使用WITH子句創建示例數據非常酷! – 2013-10-21 20:34:05

回答

2
SELECT DName, 
     avg(case when loc = 'L1' then age else null end) as "L1 Avg", 
     avg(case when loc = 'L2' then age else null end) as "L2 Avg" 
FROM Dept d 
LEFT JOIN Emp USING (DName) 
GROUP BY DName 
+0

,如果你真的有更多的位置,也許可以使用「交叉表」來使查詢更好。 – 2013-02-12 08:18:01

+0

感謝馬。這是非常簡潔的查詢。 – Gopal 2013-02-12 08:40:33