Sql 从group by子句中省略引用的列

Sql 从group by子句中省略引用的列,sql,oracle,Sql,Oracle,我只想按地理位置和项目名称分组: Geography Project_name Test_name Actual count Plan count Russia test1 samp4 3 3 Russia test1 samp5 66 19 Russia test1 samp2 133

我只想按地理位置和项目名称分组:

Geography  Project_name  Test_name  Actual count  Plan count
Russia     test1         samp4                 3           3
Russia     test1         samp5                66          19
Russia     test1         samp2               133          79
Russia     gen1          samp1               170          16
Vietnam    test1         samp2                35          17
Vietnam    gen1          samp1                91           4
我得到了这个问题的答案

Geography  Project name actual count
Russia     test1                 202
Russia     Gen1                  170
Vietnam    Test1                  35
Vietnam    Gen1                   91
这很有效……感谢所有试图帮助我的人。

试试这个:

 SELECT GEOGRAPHY ,  
      CASE
        WHEN project_name = 'test1'
        THEN 'test1'
        WHEN project_name = 'test2'
        THEN 'test2'
        WHEN project_name    = 'test3'
        AND test_NAME = 'samp1'
        THEN 'gen1'
        WHEN project_name     = 'test3'
        AND  TEST_name <> 'samp1'
        THEN 'gen2'
        ELSE project_name
      END PROJECT_NAME from table 1
    group by 
    geography ,CASE
        WHEN project_name = 'test1'
        THEN 'test1'
        WHEN project_name = 'test2'
        THEN 'test2'
        WHEN project_name    = 'test3'
        AND test_NAME = 'samp1'
        THEN 'gen1'
        WHEN project_name     = 'test3'
        AND  TEST_name <> 'samp1'
        THEN 'gen2'
        ELSE project_name
      END .

如果一个地理/项目名称组合有多个测试名称,该怎么办?其实并不相关,但前两个when子句似乎是多余的,因为它们包含在else中?请不要使用注释发布代码或进行更正。这次我为你编辑了这个问题,如果我做得对,你可以删除你的评论。但是,如果有两个测试名称,这仍然不能解决您希望发生的事情。在您当前的输出和您希望得到的结果之间似乎没有任何区别?我希望添加低于实际计数和计划计数。在下面的示例中,如果我按地理位置和项目名称分组,它会添加..但不能这样做,因为我必须按地理位置名称分组,项目名称和测试名称地理项目名称测试名称实际计数计划计数俄罗斯测试1 samp4 3 3俄罗斯测试1 samp5 66 19俄罗斯测试1 samp2 133 79输出的前三行仍然相同。请回答问题,以显示您实际希望看到的输出。哪些列,它们应该具有哪些值,以及聚合计数应该是多少。我猜你想要俄罗斯的一排,test1202101;第二排是俄罗斯,Gen1170,16;等等,但还不清楚。显示实际的当前查询也可能有所帮助。同样,在问题中,不是作为注释。脚本将编译:Group by apply on sub-query。抱歉,我完全误解了它-你是对的。尽管它仍然没有回答问题;OP似乎想包括他们拥有的专栏;但是他们的SQL在所选内容和分组内容之间不一致。他们仍然需要做出决定,而不仅仅是删除列。如果他们想这样做,就不需要进行子选择/据我所知,OP尝试从项目名称和测试名称计算新列,然后对记录进行分组。它可以通过子查询或test_name列的聚合函数来完成。我认为这个答案很可能是正确的答案,尽管没有样本数据和期望的结果,这有点难说。如果这是OP想要的,那么它可以通过distinct和no subquery来实现。它不需要分组,因为当前没有聚合。不过,目前还不清楚数据是什么或输出是什么。
 SELECT GEOGRAPHY ,  
      CASE
        WHEN project_name = 'test1'
        THEN 'test1'
        WHEN project_name = 'test2'
        THEN 'test2'
        WHEN project_name    = 'test3'
        AND test_NAME = 'samp1'
        THEN 'gen1'
        WHEN project_name     = 'test3'
        AND  TEST_name <> 'samp1'
        THEN 'gen2'
        ELSE project_name
      END PROJECT_NAME from table 1
    group by 
    geography ,CASE
        WHEN project_name = 'test1'
        THEN 'test1'
        WHEN project_name = 'test2'
        THEN 'test2'
        WHEN project_name    = 'test3'
        AND test_NAME = 'samp1'
        THEN 'gen1'
        WHEN project_name     = 'test3'
        AND  TEST_name <> 'samp1'
        THEN 'gen2'
        ELSE project_name
      END .
select geography, project_name
  from ( select geography
              , project
              , case when project_name = 'test1' then 'test1'
                     when project_name = 'test2' then 'test2'
                     when project_name = 'test3'
                       and test_name = 'samp1' then 'gen1'
                     when project_name = 'test3'
                       and test_name <> 'samp1' then 'gen2'
                     else project_name
                     end project_name
           from table1 )
 group by geography, project_name