2009-05-06 11 views
0

J'ai une table qui contient, entre autres choses, environ 30 colonnes de drapeaux booléens qui indiquent des attributs particuliers. Je voudrais les retourner, classés par fréquence, comme un jeu d'enregistrements ainsi que leurs noms de colonnes, comme ceci:Comment faire la somme de plusieurs valeurs booléennes via SQL?

Attribute Count 
attrib9  43 
attrib13  27 
attrib19  21 
etc. 

Mes efforts ainsi FARpeut obtenir quelque chose de similaire, mais je ne peux obtenir les attributs dans les colonnes à l'aide SUM conditionnelles, comme celui-ci:

SELECT SUM(IIF(a.attribIndex=-1,1,0)), SUM(IIF(a.attribWorkflow =-1,1,0))... 

de plus, la requête est déjà difficile à manier devient un peu avec tous les 30 SUM/IIF et ne gère aucun changement dans le nombre d'attributs sans intervention manuelle.

Les six premiers caractères des colonnes d'attributs sont identiques (attrib) et uniques dans la table, est-il possible d'utiliser des caractères génériques dans les noms de colonne pour récupérer toutes les colonnes applicables?

De plus, puis-je faire pivoter les résultats pour me donner un jeu d'enregistrements à deux colonnes triées? J'utilise Access 2003 et la requête sera éventuellement via ADODB à partir d'Excel.

Répondre

1

Cela dépend si oui ou non vous avez les noms d'attributs partout dans les données. Si vous le faites, alors la réponse de birdlips fera l'affaire. Cependant, si les noms ne sont que des noms de colonnes, vous avez un peu plus de travail à faire - et je suis afriad vous ne pouvez pas le faire avec un simple SQL.

Non, vous ne pouvez pas utiliser de caractères génériques dans les noms de colonnes dans SQL. Vous aurez besoin d'un code procédural pour le faire (c'est-à-dire, un module VB dans Access - vous pourriez le faire dans une procédure stockée si vous étiez sur SQL Server). Utilisez ce code pour créer le code SQL.

Ce ne sera pas joli. I pense vous aurez besoin de le faire un attribut à la fois: sélectionnez une chaîne dont la valeur est ce nom d'attribut et le count-where-True, puis soit A) exécuter cela et stocker le résultat dans une nouvelle ligne dans un scratch table, ou B) ajouter toutes ces sélections ensemble avec "Union" entre eux avant d'exécuter le lot.

Mon VB Access est plus un peu rouillé, donc je ne me fie pas à vous donner quelque chose comme un code exécutable ....

+0

Merci, je pense que je vais finir par le faire de cette façon. Je peux saisir les noms de colonnes en utilisant .fields (x) .name puis boucler et construire ma table. – Lunatik

1

Juste un compte simple et groupe en devrait le faire

Select attribute_name 
     , count(*) 
     from attribute_table 
    group by attribute_name 

Pour répondre à votre utilisation de commentaires Fonctions analytiques pour que:

Select attribute_table.* 
     , count(*) over(partition by attribute_name) cnt 
    from attribute_table 
+0

Cependant, il y a plus que ces attributs dans cette table. Si j'étais capable de réorganiser la base de données, je le ferais, mais je suis coincé avec ce schéma. Aussi je veux énumérer tous les attributs, pas seulement un. Comment allez-vous gérer cela? – Lunatik

+0

vous pouvez utiliser des fonctions analytiques pour cela: Sélectionnez table_attribut.* , compte (*) terminé (partition par nom_attribut) cnt from attribute_table Cela vous donnera un total de l'attribut_name et retournera tous les attributs ainsi que chaque ligne (avec le total bien sûr) – northpole

+0

Avez-vous testé ces fonctions dans Access? Pour autant que je sache, ils ne sont pas supportés par Jet SQL. –

0

Dans Access, les requêtes Cross Tab (l'outil traditionnel de transposition des jeux de données) besoin d'au moins 3 champs numériques/date pour travailler. Cependant, comme la sortie est vers Excel, avez-vous envisagé simplement de sortir les données vers une feuille cachée, puis d'utiliser un tableau croisé dynamique?

+0

Oui, c'était mon plan de sauvegarde. – Lunatik

Questions connexes