按子查询分组

Group by subquery

我有以下查询

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)

两个分组 returns 相同的结果。我不确定哪个查询是正确的。 有人帮我解决这个问题吗?

始终尝试实现您在 "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)

我在您的 Select 中看不到任何聚合列。如果您的 select 不需要聚合,那么您可以简单地摆脱分组依据。如果结果集中有任何重复记录,您可以实施不同的。

在您最后发表评论后,我想我终于明白您对我们的期望了。

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

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

之所以returns相同的结果完全是基于数据的。可能存在 2 个查询 returns 不同结果的情况。

在你的例子中,如果它 returns 相同的结果,那就意味着 col1 永远不会 NULL

这两个查询不一定会给出相同的结果。哪个正确取决于您的要求。这是一个示例,仅使用通过聚合输入列 ADD1ADD2.

获得的新 ADDRESS

假设在一行中有 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 分组,但在其他类似结构的情况下,这不是您想要或需要的。