TSQL Question: Groupe par sur plusieurs colonnes
-
27-10-2019 - |
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.
questionNote finale Code Review ce que je suis venu avec. Unpivot pour construire une liste de paires uniques la date / valeur.
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