2013-04-29 42 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