2014-10-06 50 views
0

我想從表的兩個獨立列中獲取不同值的COUNT值。來自表的兩個獨立列的不同值的MySQL COUNT

我的表是:

ID  CR PB  DB CB  
----------------------------- 
1  1000  1000 
2  60000  1000 
3  1000  (NULL) 
4 1500000  13000 
5  60000  12000 
6  1000  (NULL) 

預期輸出:

CR PB cnt_crpb DB CB cnt_dbcb 
1000  3  1000  2 
60000  2  13000  1 
1500000 1  12000  1 

我試圖在兩個不同的表都列CR PBDB CB分離和使用LEFT JOIN加入了他們,但是沒有得到預期輸出爲MySQL不支持FULL OUTER JOIN。

我也試過使用UNION,但在行中給出了結果。

任何幫助將不勝感激...

謝謝你。

+2

你如何將CR PB和DB DB關聯起來,使它們出現在同一行? – Barranka 2014-10-06 15:10:10

+1

@Barranka:看起來OP不希望它們出現在同一行(這是我們所期望的);看起來這些行在「cnt_crpb」和「cnt_dbcb」的遞增值上相關(最高值與最高值相關,次高最高,次高),這是一個相當離奇的結果。可以像這樣返回結果,但是SQL更容易參與。規範的方法是將計數作爲單獨的行集返回。 – spencer7593 2014-10-06 15:22:27

回答

2

我認爲你需要做到這一點使用union all奇數結果:

select max(CRPB) as CRPB, max(CRPB_cnt) as CRPB_cnt, max(DBCB) as DBCB, max(DBCB_cnt) as DBCB_cnt 
from ((select (@rn1 := @rn1 + 1) as rn, CRPB, count(CRPB) as CRPB_cnt, NULL as DBCB, NULL as DBCB_cnt 
     from table t cross join 
      (select @rn1 := 0) as vars 
     group by CRPB 
    ) union all 
     (select (@rn2 := @rn2 + 1) as rn, NULL, NULL, DBCB, count(DBCB) as DBCB_cnt 
     from table t cross join 
      (select @rn2 := 0) as vars 
     group by DBCB 
    ) 
    ) x 
group by rn; 

這將保證結果不管是哪個名單最長。

+0

這與我將使用的方法類似。 (我的情況稍微複雜一點,我認爲規範是通過按降序排列它們來計算「相關」的計數(CRPB的最高計數和DBCB的最高計數,次高的是次高)。我得到計數首先,然後分配了rownum,然後做了UNION ALL這些結果 – spencer7593 2014-10-06 15:38:34

+0

(第二組應該是由DBCB組成的) – spencer7593 2014-10-06 15:55:30

+0

唯一的另外一個問題是這沒有處理NULL值,所以它返回一個額外的行[ ** HERE **](http://sqlfiddle.com/#!2/29af0/3)首先要刪除空位:)從我+1,但不錯的答案! – 2014-10-06 16:03:49

1

請注意,您需要確定哪一列會產生更多的結果,即CR PBDB CB哪一個產生最多結果將是您想要做的第一個選擇,然後加入另一個。假設有來自兩個

SELECT `CR PB`, cnt_crpb, `DB CB`, cnt_dbcb 
FROM 
( SELECT `CR PB`, COUNT(*) as cnt_crpb, @a := @a + 1 as num_rows_a 
    FROM test_table 
    CROSS JOIN (SELECT @a := 0) temp 
    WHERE `CR PB` is not null 
    GROUP BY `CR PB` 
)t 
LEFT JOIN 
( SELECT `DB CB`, COUNT(*) as cnt_dbcb, @b := @b + 1 as num_rows_b 
    FROM test_table 
    CROSS JOIN (SELECT @b := 0)temp1 
    WHERE `DB CB` is not null 
    GROUP BY `DB CB` 
)t1 ON t1.num_rows_b = t.num_rows_a; 

Fiddle Demo

+0

如果第二個列表比第一個列表長,那麼使用「left join」會導致結果丟失。 – 2014-10-06 15:31:13

+1

這是一種方法。一些問題:如果「DB CB」的「獨特」值比「CR PB」的「不同」值有多少?執行此語句時,如果udv「@ a」的值爲3,該怎麼辦? (我認爲規範是不明確的,行是按照'CR PB'的遞增值排序,還是按遞減的計數值,'DB CB'的遞減值排序。) – spencer7593 2014-10-06 15:32:53

+0

確實行數可能是更多的一方比另一方......關聯兩個不相關的列並不容易。但這是OP需要在他身邊測試的東西。 – 2014-10-06 15:36:07

相關問題