2016-08-22 75 views
0

我有以下查询集团子查询

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) 

两个地址为默认通过返回相同的结果。我不确定哪个查询是正确的。 有人帮我解决这个问题吗?

+1

显示一些示例数据,你会得到什么,以及你想要什么...... – Ditto

+0

不知道为什么你需要一个没有聚合的组...你有重复的数据,只需要在选择不同的? – xQbert

+0

@xQbert请参阅我的更新.. –

回答

1

这两个查询不一定会产生相同的结果。这是正确的取决于你的要求。以下是一个示例,仅使用通过汇总输入列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进行分组,但在其他类似结构的情况下,这些情况不会成为您想要或需要的情况。

3

总是尝试实现您在“分组依据”中的选择语句中提到的所有列(具有相同的格式),聚合列除外。在你的情况下,我宁愿采用第二种方法。

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) 

我看不到您的选择中的任何聚合列。如果你的选择不需要聚合,那么你可以简单地摆脱组合。如果结果集中有任何重复记录,则可以实现不同的结果。

1

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

两个查询是正确的,基本上是因为这两种方式,你的SELECT子句中所列出的所有本领域在GROUP BY子句

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

它返回相同的reults的原因纯粹是基于数据的。可能有两个查询返回不同结果的场景。

在你的情况,如果返回相同的结果,那岂不是col1是从来没有NULL