2015-11-12 8 views
1

У меня есть таблица вроде этого:Граф ID в каждой колонке по ID

id | col1 | col2 | col3 | 
------------------------- 
1 | ab | ab |  | 
2 | bc | ab | cd | 
3 | bc | cd | cd | 

И я хочу, чтобы произвести подсчет каждого из имен в каждой колонке, как это:

name | col1 | col2 | col3 | 
------------------------- 
ab | 1 | 2 | 0 | 
bc | 2 | 0 | 0 | 
cd | 0 | 1 | 2 | 

Обратите внимание, что это всего лишь пример, на самом деле существует 1000 имен, решение должно будет указывать столбцы, но не имена.

Это, вероятно, очень просто, и я попытался его найти, но не смог найти ничего подходящего, вероятно, потому что я не знал правильного термина.

я использовал что-то вроде этого, чтобы подсчитать общее число вхождений каждого имени, но я не могу понять, как разделить его обратно по столбцам: Selecting distinct records from multiple column of a table with their count

Это использование MYSQL.

ответ

1
select name, sum(cnt1), sum(cnt2), sum(cnt3) 
from 
(
select col1 as name, count(*) as cnt1 , null as cnt2 , null as cnt3 from t group by col1 
union all 
select col2, null, count(*), null from t group by col2 
union all 
select col3, null, null, count(*) from t group by col3 
) as dt 
+0

Это работает, спасибо! –

0

, возможно, это будет работать

select colcounts.col, sum(colcounts.cnt) from 
(
    (select col1 as col, count(*) as cnt from TableLikeThis group by col1) 
    union 
    (select col2 as col, count(*) as cnt from TableLikeThis group by col2) 
    union 
    (select col3 as col, count(*) as cnt from TableLikeThis group by col3) 
) as colcounts 
group by col 

Sql Fiddle Here

0

Надеется, что это поможет:

select name ,sum(s1), sum(s2), sum(s3) 
    from 
    (
    select cnt1 as name , count(cnt1) as s1, count(if(cnt2=cnt1,1,0)) as s2, count(if(cnt3=cnt1,1,0)) as s3 
     from your_table group by cnt1 
    union all 
    select cnt2 as name , count(if(cnt1=cnt2,1,0)) as s1, count(cnt2) as s2, count(if(cnt3=cnt2,1,0)) as s3 
     from your_table group by cnt2 
    union all 
    select cnt3 as name , count(if(cnt1=cnt3,1,0)) as s1, count(if(cnt2=cnt3,1,0)) as s2, count(cnt3) as s3 
     from your_table group by cnt3 
    ) 
    group by name 
+0

Я получил ошибку в инструкции if с этим, тогда как решение jarlh работало. Они очень похожи. –

Смежные вопросы