2013-04-29 40 views
1

我有一個自加入表的問題,其中group by不能正常工作或者我的代碼有問題。自發加入羣組?

我正在嘗試生成一張表,其中包含住房銷售數據,並希望按地區和住房類型對結果進行分組。

這是我到目前爲止,它接近我所需要的。

SELECT A1.AREA AREA, 
    TRUNC((A1.SOLD_PRICE/A1.ASK_PRICE*100), 2) || '%' "ATT/ROW/TWNHOUSE", 
    TRUNC((A2.SOLD_PRICE/A2.ASK_PRICE*100), 2) || '%' "DETACHED", 
    TRUNC((A3.SOLD_PRICE/A3.ASK_PRICE*100), 2) || '%' "SEMI-DETACHED" 
FROM SALESRECORDS A1, SALESRECORDS A2, SALESRECORDS A3 
WHERE A1.AREA = A2.AREA AND A1.AREA = A3.AREA 
GROUP BY A1.AREA, A1.HOUSE_TYPE; 

這給了我錯誤ORA-00979: not a GROUP BY expression

當我遵循SQL規則,我by子句中的所有項目添加到組,我得到類似於語句中的順序結果....

SELECT A1.AREA, 
    TRUNC((A1.SOLD_PRICE/A1.ASK_PRICE*100), 2) || '%' "ATT/ROW/TWNHOUSE", 
    TRUNC((A2.SOLD_PRICE/A2.ASK_PRICE*100), 2) || '%' "DETACHED", 
    TRUNC((A3.SOLD_PRICE/A3.ASK_PRICE*100), 2) || '%' "SEMI-DETACHED" 
FROM SALESRECORDS A1, SALESRECORDS A2, SALESRECORDS A3 
WHERE A1.AREA = A2.AREA AND A1.AREA = A3.AREA 
GROUP BY A1.AREA, A1.SOLD_PRICE, A1.ASK_PRICE, A2.SOLD_PRICE, A2.ASK_PRICE, 
    A3.SOLD_PRICE, A3.ASK_PRICE; 

誰能告訴我是什麼我做錯了....?

+0

你爲什麼認爲你需要一組?你從第二個陳述中得到什麼結果?你希望得到什麼結果? – Craig 2013-04-29 17:26:13

回答

0

注意:根據附加信息編輯。還解決了我原始答案中不匹配的括號。

請求的輸出看起來是這樣的:

Area Att/Row/Twnhouse Detached Semi-Detached 
---- ---------------- -------- ------------- 
East 20.00%   33.33% 75.12% 
West 22.22%   44.44% 55.10% 

如果你需要爲一組的總百分比,唯一安全的方式做到這一點是計算總的「賣出價」總「問價格「,然後對總數進行數學計算。爲此你需要一個子查詢來總結一切。外部查詢可以進行數學運算。

嘗試這樣:

SELECT 
    Area "Area", 
    ROUND(TownhouseSold/TownhouseAsk * 100, 2) || '%' "Att/Row/Twnhouse", 
    ROUND(DetachedSold/DetachedAsk * 100, 2) || '%' "Detached", 
    ROUND(SemiDetachedSold/SemiDetachedAsk * 100, 2) || '%' "Semi-Detached" 
FROM (
    SELECT 
    Area, 
    SUM(CASE WHEN House_Type = 'Att/Row/Twnhouse' THEN Sold_Price END) AS TownhouseSold, 
    SUM(CASE WHEN House_Type = 'Att/Row/Twnhouse' THEN Ask_Price END) AS TownhouseAsk, 
    SUM(CASE WHEN House_Type = 'Detached' THEN Sold_Price END) AS DetachedSold, 
    SUM(CASE WHEN House_Type = 'Detached' THEN Ask_Price END) AS DetachedAsk, 
    SUM(CASE WHEN House_Type = 'Semi-Detached' THEN Sold_Price END) AS SemiDetachedSold, 
    SUM(CASE WHEN House_Type = 'Semi-Detached' THEN Ask_Price END) AS SemiDetachedAsk 
    FROM SalesRecords 
    GROUP BY Area 
) 
ORDER BY Area 

附錄問題重新表述爲「銷量比要價更高,由區住房的比例」。

方法是統計(a)房屋數量和(b)高於要價的銷售數量,並按面積分組。這是內部查詢。它也是房屋類型的樞紐。外部查詢計算百分比。這裏是:

SELECT 
    Area "Area", 
    ROUND(TownhouseOverAsk/TownhouseCount * 100, 2) || '%' "Att/Row/Twnhouse", 
    ROUND(DetachedOverAsk/DetachedCount * 100, 2) || '%' "Detached", 
    ROUND(SemiDetachedOverAsk/SemiDetachedCount * 100, 2) || '%' "Semi-Detached" 
FROM (
    SELECT 
    Area, 
    SUM(CASE WHEN House_Type = 'Att/Row/Twnhouse' THEN 1 END) AS TownhouseCount, 
    SUM(CASE WHEN House_Type = 'Att/Row/Twnhouse' AND Sold_Price > Ask_Price THEN 1 END) AS TownHouseOverAsk, 
    SUM(CASE WHEN House_Type = 'Detached' THEN 1 END) AS DetachedCount, 
    SUM(CASE WHEN House_Type = 'Detached' AND Sold_Price > Ask_Price THEN 1 END) AS DetachedOverAsk, 
    SUM(CASE WHEN House_Type = 'Semi-Detached' THEN 1 END) AS SemiDetachedCount, 
    SUM(CASE WHEN House_Type = 'Semi-Detached' AND Sold_Price > Ask_Price THEN 1 END) AS SemiDetachedOverAsk, 
    FROM SalesRecords 
    GROUP BY Area 
) 
ORDER BY Area 
+0

沒問題,但你想要結果看起來像什麼?如果我上面的假設不正確,您可以編輯您的問題並添加預期輸出的示例?另外,你真的想截斷百分比嗎?在這種情況下,舍入通常更合適。 – 2013-04-29 18:21:48

+0

糟糕 - 抱歉;我沒有首先獲得sites.google.com鏈接。現在我明白了。我會快速查看。 – 2013-04-29 18:23:36

+0

好的;答案已更新。我無法閱讀Oracle表格內容屏幕截圖('Java Printing.pdf'文檔),因爲它太小,我試圖放大時會模糊,所以我無法從中獲取更多信息。預期的結果文件('goal.jpg')很清楚。上面的查詢會讓你非常接近,如果不是所有的話。 – 2013-04-29 18:38:45