2010-08-11 5 views
0

J'ai reçu un tableau qui est rempli par '1' et '0' selon les réponses oui/non à un sondage. On m'a demandé d'identifier toutes les réponses totalement distinctes, c'est-à-dire les personnes ayant répondu «Oui» aux questions 1, 17, 23, 234 et 238. Il y a beaucoup de colonnes (plus de 500) et donc beaucoup de permutations. Des idées?Identifier les correspondances de lignes sur plusieurs colonnes

+0

qui SGBDR et peut vous fournir une entrée d'échantillonnage et de sortie? –

+0

SQL Server 2000. Malheureusement, je n'ai pas de données d'exemple (542 questions seraient beaucoup à télécharger). Le sondage est en cours d'achèvement au moment où nous parlons, et on m'a donné une idée de ce à quoi ressemblerait la table. Pensé que je ferais mes devoirs d'abord .... – Leem

Répondre

0

Les chiffres que vous mentionnez sont un peu déroutants: sont-ils juste un exemple? Vous connaissez l'instruction DISTINCT en SQL? Cela, et la sélection correcte des colonnes que vous voulez, devrait résoudre votre problème.

La réponse de Byron (maintenant supprimée: elle avait un select distinct avec toutes les 500 colonnes écrites à la main) est bonne, et utilise des noms de colonnes explicites, ce qui est une bonne pratique dans de nombreux cas. Si vous voulez une notation plus courte, votre version sql peut prendre en charge Select Distinct *.

+0

Les chiffres mentionnés étaient juste un exemple. Je dois admettre que je n'étais pas au courant que la clause DISTINCT pourrait être utilisée sur plusieurs colonnes (enthousiaste novice - désolé). – Leem

0
select count(distinct col_name) from table_name where answer = '1' and id in (1,17,23,234,238) 
+0

Je pense que chaque colonne représente une question et chaque ligne représente l'entrée de l'utilisateur – Adeel

+0

Correct, et les chiffres donnés étaient juste un exemple, mais merci quand même – Leem

1

Employez votre éditeur de texte ou utilisez votre outil de base de données pour produire une liste des noms de colonnes,

puis juste faire ce

select max(person_id) 
from answer_table 
group by (
    a1,a2,a3,.... -- paste list of columns here. 
) 
having count(
    a1,a2,a3.... 
) = 1; -- return only answer sets that have no duplicate 

max(person_id) va se retirer l'ID de la personne seule sans casser le groupe par.

+0

Ah, mon interprétation des réponses distinctes comprenait des personnes distinctes aussi, mais ce n'est probablement pas correct. – Tobiasopdenbrouw

+0

Il y a seulement certaines questions qui se rapportent à la personne qui remplit le formulaire. Je crois (et j'espère) qu'on leur donnera une pièce d'identité unique. Je peux omettre ces noms de colonne de la clause GROUP BY. – Leem

+0

oh, ouais whoops ... il y aurait une identification de personne là-bas ne serait pas là .... OK, code édité. –

0

Les déclarations suivantes présupposent votre entrée est 2,3 et les colonnes sont 2Q, 3Q ...

DECLARE @QueryInput VARCHAR(100) 
DECLARE @Query nVARCHAR(4000) 
SET  @QueryInput = '2,3' 
SET  @QueryInput = REPLACE(@QueryInput,',','=1 AND Q') 
SET  @QueryInput = 'Q'[email protected] 
SET  @QueryInput = @QueryInput+'=1' 

PRINT @QueryInput 

SET  @Query = 'SELECT * FROM answer_table WHERE '[email protected] 
PRINT @Query 
EXEC SP_EXECUTESQL @Query 
Questions connexes