按子查询分组

时间:2016-08-22 14:14:16

标签: oracle group-by oracle10g

我有以下查询

Select id, name, add1 || ' ' ||add2 address,
        case 
            when subId =1 then 'Maths'
            else 'Science'
        End,
        nvl(col1, col2) sampleCol
From Student_tbl
Where department = 'Student'

我希望按地址将此查询分组为默认

我试过

Group by add1 ,add2 ,id, name, subId, col1, col2

Group by add1 || ' ' ||add2,id, name,
         case 
            when subId =1 then 'Maths'
            else 'Science'
        End,
        nvl(col1, col2)

两组都返回相同的结果。我不确定哪个查询是正确的。 有人帮我这个吗?

3 个答案:

答案 0 :(得分:3)

始终尝试实现您在" Group By"中的select语句中提到的所有列(具有相同格式)。聚合列除外。在你的情况下,我更喜欢第二种方法。

SELECT id
    ,NAME
    ,add1 || ' ' || add2 address
    ,CASE 
        WHEN subId = 1
            THEN 'Maths'
        ELSE 'Science'
        END
    ,nvl(col1, col2) sampleCol
FROM Student_tbl
WHERE department = 'Student'
GROUP BY id
    ,NAME
    ,add1 || ' ' || add2
    ,CASE 
        WHEN subId = 1
            THEN 'Maths'
        ELSE 'Science'
        END
    ,nvl(col1, col2)

我在“选择”中看不到任何汇总列。如果您的选择不需要聚合,那么您可以简单地摆脱分组。如果结果集中存在任何重复记录,则可以实现distinct。

答案 1 :(得分:1)

在您上次发表评论后,我想最终了解您对我们的期望。

两个查询都是正确的,因为对于您在SELECT子句中列出的两种方法,GROUP BY子句中都存在所有字段

你在做什么在这里有点奇怪,因为GROUP BY包含id,我想这是每行的唯一标识符,所以你最终没有分组任何东西。您将获得与表格一样多的行。

它返回相同结果的原因纯粹是基于数据的。可能存在2个查询返回不同结果的情况。

在您的情况下,如果它返回相同的结果,则表示col1永远不会NULL

答案 2 :(得分:1)

这两个查询不一定会给出相同的结果。哪个是正确的取决于您的要求。这是一个示例,只使用汇总输入列ADDRESSADD1得到的新ADD2列。

假设您在一行中有ADD1 = 123 Main Street, Portland,ADD2 = Oregon.然后在输出中ADDRESS = 123 Main Street, Portland, Oregon

在另一行中,您有ADD1 = 123 Main Street,ADD2 = Portland, Oregon。对于此行,生成的ADDRESS是相同的。

如果按ADDRESS分组,则两个输出行将位于同一组中,但如果按ADD1, ADD2分组,则它们将位于不同的组中。在此示例中,您可能希望按ADDRESS进行分组,但在其他类似结构的情况下,可能不是您想要或需要的。