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