SQL Group by包含备用列值

时间:2018-02-22 15:22:20

标签: sql oracle

我有下表:

ID,col1,col2,total
1,artist1,artist2,3
2,artist2,artist1,4

如何对列col1和col2进行分组并对总数求和,以便在这样的情况下得到:

artist1,artist2, 7 

如果两行包含相同的两个值,但值位于相反的列中,我仍然喜欢两行的总和(总计),如果这有意义的话。

2 个答案:

答案 0 :(得分:2)

大多数数据库都有open("filename", 'rb')var sf = new SearchFilter.IsEqualTo(ItemSchema.ItemClass, "REPORT.IPM.Note.NDR"); var SearchFilter searchFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, sf); var view = new ItemView(1000) {PropertySet = new PropertySet(BasePropertySet.IdOnly)}; var findResults = service.FindItems(WellKnownFolderName.Inbox, searchFilter, view); 。如果是这样,你可以这样做:

least()

对于没有的数据库,使用greatest()很容易实现相同的逻辑。

答案 1 :(得分:0)

要通过不同(相反)列的相等来过滤行,您应该在表上使用表的INNER JOIN,并使用相反的列作为连接的条件:

select t1.col1, t1.col2 from YOURTABLE t1
inner join YOURTABLE t2
on t1.col1 = t2.col2
and t1.col2 = t2.col1;

如果您不需要所有艺术家在所有列中都相同的行对(“artist1”在col1和col2中也在两行中),那么您需要过滤掉这些情况:

select t1.col1, t1.col2 from YOURTABLE t1
inner join YOURTABLE t2
on t1.col1 = t2.col2
and t1.col2 = t2.col1
and t1.col1 <> t1.col2; 

选择所需的行后,您可以将它们的总和相加。您将获得所需的结果:

select sum(t1.total) from YOURTABLE t1
inner join YOURTABLE t2
on t1.col1 = t2.col2
and t1.col2 = t2.col1
and t1.col1 <> t1.col2;

如果您需要显示此总数的艺术家姓名,您应该指定应该显示哪个艺术家(来自第一行或第二行或什么?)。您没有为此指定任何条件。您可以使用MIN和MAX函数或LEAST和GREATEST或任何其他多行函数。这是一个例子:

select min(t1.col1), max(t1.col2), sum(t1.total) from YOURTABLE t1
inner join YOURTABLE t2
on t1.col1 = t2.col2
and t1.col2 = t2.col1
and t1.col1 <> t1.col2;

希望这有帮助!