[英]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 PB
和DB 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 PB
或DB 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.