2014-03-26 16 views
0

時有條件地排除記錄,我需要一些幫助編寫查詢,我真的不知道從哪裏開始。我的數據看起來像這樣(簡化爲這個職位):的MySQL如何分組

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 

第八列有userid在裏面,像這樣:B89D1424AB2649E38386EDC287D5C862。你可以從這個數據注意的是,每個帳戶/記錄已被複制具有管理員的userid在8列(管理員的用戶ID是A6E5B9243B1445978F49961574912E8D)。第一條記錄只有一次發生,因爲該帳戶實際上屬於管理員,而其他帳戶實際上屬於其他用戶標識(它們也出現在管理員視圖中)。

好吧,這裏是我所需要的:

  • 總和的第三列,不包括管理員的記錄時,該帳戶實際上是由另一個用戶擁有
  • 即使管理員帳戶從其他款項排除當賬戶已被管理員自己

所以擁有它應該包括在內,其結果應該是這樣的:

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指令。

+0

什麼是列名 – AgRizzo

+0

它是什麼你想分組? –

+0

如果每個帳戶總是隻有一行,並且因此每個帳戶的第3列中只有一個值,那麼我不會看到總和/分組中的點數。彙總涉及2+行,您似乎只對排除行和每個帳戶保持1個感興趣。目前還不清楚你想要彙總什麼或爲什麼。 –

回答

2

Col1中指的是你的第一個列名的所有的人,你的col3的第三列名等

第一部分該查詢抓取具有col8 admin和non-admin的帳戶的非管理帳戶。

此查詢的第二部分,抓住具有col8只是管理員帳戶管理員帳戶。

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 
0

選擇由管理員和UNION擁有的非管理員的人

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

在這個特定的示例中,我發佈了'globalreport'表中的一個數據集,但是,這個相同的主題存在於所有發佈的SO問題中的表中,所以如果解決方案是在每個表上使用UNION,那麼該查詢會變得非常長,因爲該查詢中已經有很多聯合。 – sadmicrowave

+0

它可以是UNION或子查詢。無論哪種情況,如果閱讀起來很複雜,那麼我建議你開始使用視圖來抽象可讀性和可維護性的邏輯 – AgRizzo