按子查询分组
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
这两个查询不一定会给出相同的结果。哪个正确取决于您的要求。这是一个示例,仅使用通过聚合输入列 ADD1
和 ADD2
.
获得的新 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
分组,但在其他类似结构的情况下,这不是您想要或需要的。
我有以下查询
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
这两个查询不一定会给出相同的结果。哪个正确取决于您的要求。这是一个示例,仅使用通过聚合输入列 ADD1
和 ADD2
.
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
分组,但在其他类似结构的情况下,这不是您想要或需要的。