簡體   English   中英

來自表的兩個獨立列的MySQL COUNT個不同值

[英]MySQL COUNT of distinct values from two independent columns of a table

我想從一個表的兩個獨立列中獲得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,但它在行中給出結果。

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

謝謝。

我認為您需要使用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;

無論哪一個列表最長,都將保證結果。

請注意,您需要確定哪一列將產生更多結果,也就是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;

小提琴演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM