2017-10-05 12 views
0

J'ai les données suivantes:comte par colonne

data

Et je veux savoir à quelle fréquence chaque valeur existe dans chaque colonne. Donc, ma sortie preffered devrait ressembler à ceci:

output

je serais vraiment reconnaissant, si quelqu'un peut me aider. Merci!

+1

Quel RDBMS utilisez-vous? Veuillez marquer. Aussi, qu'avez-vous essayé jusqu'à présent? Montrez votre effort .. –

+0

Veuillez coller le texte, pas les images. Qu'avez-vous essayé et où êtes-vous coincé? –

+0

Je n'ai pas encore beaucoup essayé, parce que je n'ai pas vraiment la moindre idée. – Nico

Répondre

0

C'est une structure de table bizarre et/ou une tâche. Vous voudrez peut-être réfléchir à la conception de votre base de données. Quoi qu'il en soit ...

select 
    num, 
    coalesce(agga.cnt, 0) as a, 
    coalesce(aggb.cnt, 0) as b, 
    coalesce(aggc.cnt, 0) as c, 
    coalesce(aggd.cnt, 0) as d 
from   (select a as num, count(*) as cnt from mytable group by a) agga 
full outer join (select b as num, count(*) as cnt from mytable group by b) aggb using(num) 
full outer join (select c as num, count(*) as cnt from mytable group by c) aggc using(num) 
full outer join (select d as num, count(*) as cnt from mytable group by d) aggd using(num) 
order by num; 
1

Utilisez UNPIVOT puis PIVOT:

SQL Fiddle

Oracle 11g R2 Configuration du schéma:

CREATE TABLE table_name (a, b, c, d) AS 
SELECT 1, 2, 1, 2 FROM DUAL UNION ALL 
SELECT 1, 2, 2, 2 FROM DUAL UNION ALL 
SELECT 2, 1, 3, 3 FROM DUAL UNION ALL 
SELECT 3, 3, 2, 4 FROM DUAL UNION ALL 
SELECT 4, 4, 2, 5 FROM DUAL UNION ALL 
SELECT 5, 5, 5, 5 FROM DUAL; 

Requête 1:

SELECT * 
FROM table_name 
UNPIVOT(value FOR name IN (A, B, C, D)) 
PIVOT (COUNT(1) FOR name IN ('A' AS A, 'B' AS B, 'C' AS C, 'D' AS D)) 

Results:

| VALUE | A | B | C | D | 
|-------|---|---|---|---| 
|  1 | 2 | 1 | 1 | 0 | 
|  2 | 1 | 2 | 3 | 2 | 
|  4 | 1 | 1 | 0 | 1 | 
|  5 | 1 | 1 | 1 | 2 | 
|  3 | 1 | 1 | 1 | 1 | 
1
with 
    inputs (a, b, c, d) as (
     select 1, 2, 1, 2 from dual union all 
     select 1, 2, 2, 2 from dual union all 
     select 2, 1, 3, 3 from dual union all 
     select 3, 3, 2, 4 from dual union all 
     select 4, 4, 2, 5 from dual union all 
     select 5, 5, 5, 5 from dual 
    ) 
-- End of simulated inputs (for testing only, not part of the solution). 
-- SQL query begins BELOW THIS LINE. Use your actual table and column names. 
select grade, 
     count(case when a = grade then 0 end) as a, 
     count(case when b = grade then 0 end) as b, 
     count(case when c = grade then 0 end) as c, 
     count(case when d = grade then 0 end) as d 
from inputs cross join (select level as grade from dual connect by level <= 5) 
group by grade 
order by grade 
; 

    GRADE   A   B   C   D 
---------- ---------- ---------- ---------- ---------- 
     1   2   1   1   0 
     2   1   2   3   2 
     3   1   1   1   1 
     4   1   1   0   1 
     5   1   1   1   2 

NOTE: Ceci est essentiellement la même que la solution de MT0, mais aussi bien le unpivoting et le pivotement sont fait la "ancienne" (comme ils ont été faites avant Les opérateurs PIVOT et UNPIVOT ont été introduits dans Oracle 11.1).

+1

La plus grande différence avec cela par rapport à 'UNPIVOT' /' PIVOT' est que vous devez connaître le nombre/plage de valeurs dans le tableau avec cette méthode afin que le 'NIVEAU <= La clause 5' génère suffisamment de lignes. – MT0

+0

@ MT0 - Droite - en fait ma "NOTE" n'est pas tout à fait correcte, puisque je ne suis pas vraiment unpivot, je garde toujours les lignes d'origine en place. – mathguy