Question

I possède une table avec des colonnes multiples qui représentent les occurrences d'une action.

simpleTableExample

id  type $$$$$ value1 value2 value3 ... value15
--  ----  --   -----  -----  -----      -----
1    "I"   1    "a"    "b"    ""         ""
2    "O"   1    "a"    "d"    "f"        "z"
3    "I"   1    "d"    "b"    ""         ""
4    "O"   1    "g"    "l"    ""         ""
5    "I"   1    "z"    "g"    "a"         ""
6    "I"   1    "z"    "g"    "a"         "a"

pas vraiment sûr de savoir comment représenter les données, mais devrait le montrer ... Par suite, j'ai plusieurs colonnes ci-dessus que je veux groupe par. En se concentrant sur la partie « a », je voudrais la sortie telle que:

Type     Value    Count  Sum
-----    -----    -----  ---
"I"      "A"      "3"     3
"O"      "A"      "2"     1

Il suffit de ne savez pas comment s'y prendre, ou même la meilleure façon, de regrouper par plusieurs colonnes. Si c'était une table « de haut » avec un numéro de séquence, ce serait un jeu d'enfant ...

Une chose que je suis inquiet ... est si j'ai la même valeur dans plusieurs lignes (ils ont la même action fait plusieurs fois), et j'empile les colonnes et essayer de résumer les lignes. Ainsi, par exemple la ligne 6 a 3 et 15 avec la valeur d'un, et je tente de Sum () les totaux de ce groupe, je ne veux pas 6 comptés deux fois (ci-dessus

Edit: Essayer de préciser ici ... J'ai une rangée de clients « actions ». Les actions sont regroupées en valeur1 à travers value15. Je veux obtenir un nombre de groupes « de type, la valeur ».

Le comte que j'avais plus tôt a eu tort ... Je veux que les clients distincts qui ont eu une certaine action, et non le nombre de certaines actions. Donc, I-A doit être un compte de 4, en utilisant le tableau ci-dessus visible.

question

Note finale Code Review ce que je suis venu avec. Unpivot pour construire une liste de paires uniques la date / valeur.

Était-ce utile?

La solution

En supposant SQL 2005 ou plus vous pouvez utiliser UNPIVOT puis faire votre groupe BYs et COUNT

Autres conseils

Avez-vous la possibilité de mettre la table en Première forme normale et de briser ces colonnes répétition sur une table enfant? Parce que, si on met de côté la théorie des raisons pour lesquelles 1FN est bon, la réalité pratique est que des exemples non normalisés comme ce simple faire des requêtes difficiles.

Cela étant dit, si vous êtes coincé avec ce tableau non normalisé, vous devez le code à quelque chose comme ceci:

select type
     , 'A' as Column2
     , sum(case when value1='A' or value2='A' or.....
               then 1 else 0 end) as theCount
  from theTable
 group by type

Si vous voulez requête pour plusieurs valeurs, non seulement « A », vous devez faire pivoter la table dans la requête, ce qui implique oh 15 sur les syndicats:

select type,value,count(*) from (
    select type,value1 as value from theTable
    union all
    select type,value2 as value from theTable
    union all
    select type,value3 as value from theTable
    ...and so on...
) x
group by type,value
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top