2011-08-06 1 views
0

J'ai une requête qui renvoie les personnes dans un certain ménage, mais les individus apparaissent dans des lignes séparées, ce que je veux faire est de fusionner les deux lignes en une seule.fusionner deux lignes dans la requête de retour en tant qu'un

SELECT  dbo.households.id, dbo.individuals.firstname, dbo.individuals.lastname 
FROM   dbo.households INNER JOIN 
         dbo.individuals ON dbo.households.id = dbo.individuals.householdID 
WHERE  (dbo.households.id = 10017) 

résultats actuels:

ID | First Name | Last Name | 
1 | Test  | Test1  | 
1 | ABC  | ABC1  | 

résultats souhaités: Selon

ID | First Name | Last Name |ID1| First Name1| Last Name1| 
1 | Test  | Test1  |1 | ABC  | ABC1  | 

Cependant s'il y a 3 personnes, il aurait alors besoin de fusionner les 3 et ainsi de suite

+0

Comment voulez-vous que le résultat apparaisse? Si c'est une rangée, a-t-il N * 3 colonnes pour N enregistrements? – psr

+0

Voulez-vous 'PIVOT', c'est-à-dire mettre deux lignes de données dans une rangée (prénom1, nom1, prénom2, nom2, ...)? Si c'est le cas, il nécessitera probablement un SQL dynamique car vous renvoyez un nombre dynamique de colonnes. Quelles sont les exigences que vous essayez de remplir et qui exigent que vous ayez les données dans cette mise en page? – mellamokb

+0

ouais ce que je suis inquiet, le nombre de personnes peuvent changer en fonction des ménages –

Répondre

1

la réponse à la question que j'ai posée ci-dessus, ci-dessous est un script simple qui compilerait les noms dans une chaîne puis la sortie de la chaîne (je n'ai pas accès à la syntaxe validateur maintenant Pardonne donc toute erreur):

DECLARE 
    @CNT INT, 
    @R_MAX INT, 
    @H_ID INT, 
    @R_FIRST VARCHAR(250), 
    @R_LAST VARCHAR(250), 
    @R_NAMES VARCHAR(MAX) 

SET @CNT = 0; --Counter 
SET @R_NAMES = 'Names: '; 
SELECT @R_MAX = COUNT(*) FROM dbo.individuals a WHERE a.householdID = @H_ID; --Get total number of individuals 
PRINT(@R_MAX); --Output # of matching rows 
--Loop through table to get individuals 
WHILE @CNT < @R_MAX 
    BEGIN 
     --Select statement 
     SELECT * FROM (SELECT 
      @R_FIRST = b.firstname, 
      @R_LAST = b.lastname, 
         ROW_NUMBER() OVER (ORDER BY b.lastname, b.firstname) AS Row 
     FROM 
      dbo.households a INNER JOIN 
      dbo.individuals b ON a.id = b.householdID 
     WHERE 
      (a.id = @H_ID)) AS RN WHERE (Row = @CNT); 

     SET @R_NAMES = @R_NAMES + @R_FIRST + @R_LAST + '; '; --Add individual's name to name string 
       PRINT(CAST(@CNT AS VARCHAR) + ':' + @R_NAMES); 
     SET @CNT = @CNT +1; --Increase counter 
    END 

PRINT(@R_NAMES); --Output the individuals 
+0

ne se rendait pas compte qu'il était si compliqué que je pensais que j'aurais pu faire un pour chaque type de ligne de chose, mais ça ne fonctionnait pas –

+0

Ce n'est pas la seule méthode, mais ce serait comment je le ferais. Je voudrais effectivement le jeter dans une procédure stockée pour aider à la portabilité et passer le @R_ID comme un paramètre à la procédure stockée. Vous pourriez alors même installer une boucle qui boucle à travers chaque identification de ménage. – RobB

+0

ils peuvent être dans la même colonne, mais j'ai du mal à implémenter cela dans une procédure stockée. r_id serait le même que l'ID du ménage ou est-ce l'ID de ligne –

1

vous utilisez Pourvu que SQL Server 2005 ou, vous pourriez être en mesure d'utiliser FOR XML PATH ('') pour concaténer les chaînes.

Cela devrait faire ce que vous voulez sans avoir à faire des boucles manuelles: modifier: SQL fixe pour travailler réellement (maintenant j'ai accès à SQL)

SELECT households.id, 
    STUFF(
    (
     SELECT '; ' + [firstname] + '|' + lastname AS [text()] 
     FROM individuals 
     WHERE individuals.householdID = households.id 
     FOR XML PATH('') 
    ) 
    , 1, 2, '') -- remove the first '; ' from the string 
    AS [name] 
FROM dbo.households 
WHERE (households.id = 10017) 

C'est assez proche du format des données que tu voulais.

il convertit les données en XML (sans balise XML réelle en raison de la variable PATH ('')), puis le renvoie à la ligne d'en-tête.

+0

comment fonctionne le chemin pour xml merci pour l'info ce serait une méthode intéressante –

+0

J'ai mis à jour ma réponse pour que le SQL fonctionne maintenant – Seph

Questions connexes