MySQL如何在分组时有条件地排除记录

时间:2014-03-26 01:17:59

标签: mysql sql group-by sum

我需要一些帮助来编写查询,我真的不知道从哪里开始。我的数据看起来像这样(本文简化):

 mid            dbaname            profit   payment   takeback  bonus   custid  uid
 8788260180066  Baby's Room The    37.5     -10       27.5      13.75   1025    A6E5B9243B1445978F49961574912E8D
 8788014125552  Window Brite       0        0         0         0       1025    A6E5B9243B1445978F49961574912E8D
 8788014125552  Window Brite       0        0         0         0       1025    B89D1424AB2649E38386EDC287D5C862
 8788014123644  Mr. Wash It        10       -10       0         0       1025    A6E5B9243B1445978F49961574912E8D
 8788014123644  Mr. Wash It        10       -10       0         0       1025    B89D1424AB2649E38386EDC287D5C862

第8列中有userid,如下所示:B89D1424AB2649E38386EDC287D5C862。您可以从这些数据中注意到,每个帐户/记录都是重复的,第8列中的管理员userid(管理员的用户ID为A6E5B9243B1445978F49961574912E8D)。第一个记录只有一次出现,因为该帐户实际上属于管理员,而其他帐户实际上属于另一个用户ID(它们只显示在管理员的视图中)。

好的,这就是我需要的:

  • 汇总第3列,当帐户实际上由其他用户拥有时,不包括管理员的记录
  • 即使管理员帐户被排除在其他金额之外,当帐户由管理员自己拥有时,也应该包含该帐户

所以,结果应该是这样的:

 mid            dbaname            profit   payment   takeback  bonus   custid  uid
 8788260180066  Baby's Room The    37.5     -10       27.5      13.75   1025    A6E5B9243B1445978F49961574912E8D
 8788014125552  Window Brite       0        0         0         0       1025    B89D1424AB2649E38386EDC287D5C862
 8788014123644  Mr. Wash It        10       -10       0         0       1025    B89D1424AB2649E38386EDC287D5C862

请记住,我已经简化了我的问题和数据集以使其更容易理解,完整的数据集实际上需要第3列的SUM()函数和GROUP BY指令。

2 个答案:

答案 0 :(得分:2)

Col1引用您的第一个列名称,col3引用您的第三列名称等

此查询的第一部分为非管理员帐户抓取了col8 admin和非admin的帐户。

此查询的第二部分为管理员帐户抓取了col8 just admin。

select col1, sum(col3)
  from tbl x
 where exists (select 1
          from tbl y
         where y.col1 = x.col1
           and y.col8 = 'B89D1424AB2649E38386EDC287D5C862')
   and exists (select 1
          from tbl y
         where y.col1 = x.col1
           and y.col8 <> 'B89D1424AB2649E38386EDC287D5C862')
   and y.col8 <> 'B89D1424AB2649E38386EDC287D5C862'
 group by col1
union all
select col1, sum(col3)
  from tbl x
 where not exists (select 1
          from tbl y
         where y.col1 = x.col1
           and y.col8 <> 'B89D1424AB2649E38386EDC287D5C862')
   and col8 = 'B89D1424AB2649E38386EDC287D5C862'
 group by col1

答案 1 :(得分:0)

选择admin和UNION拥有的所有非管理员

SELECT *
FROM foo
GROUP BY uid
HAVING COUNT(*)=1;
UNION
SELECT *
FROM foo
WHERE uid <> 'A6E5B9243B1445978F49961574912E8D';