J'ai les données suivantes:comte par colonne
Et je veux savoir à quelle fréquence chaque valeur existe dans chaque colonne. Donc, ma sortie preffered devrait ressembler à ceci:
je serais vraiment reconnaissant, si quelqu'un peut me aider. Merci!
J'ai les données suivantes:comte par colonne
Et je veux savoir à quelle fréquence chaque valeur existe dans chaque colonne. Donc, ma sortie preffered devrait ressembler à ceci:
je serais vraiment reconnaissant, si quelqu'un peut me aider. Merci!
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;
Utilisez UNPIVOT
puis PIVOT
:
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))
| 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 |
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).
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
@ 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
Quel RDBMS utilisez-vous? Veuillez marquer. Aussi, qu'avez-vous essayé jusqu'à présent? Montrez votre effort .. –
Veuillez coller le texte, pas les images. Qu'avez-vous essayé et où êtes-vous coincé? –
Je n'ai pas encore beaucoup essayé, parce que je n'ai pas vraiment la moindre idée. – Nico