2013-06-24 1 views
1

J'ai un client de la table dans la base de données comme ci-dessous.sélectionner les colonnes de la deuxième ligne ajouter à la fin de la première ligne dans le groupe sql par ID

ID UID Address1 Name code 
10 5 A   Jac 683501 
11 5 B   Joe 727272 
13 6 C   mat 373737 

Les deux premiers enregistrements (10,11) ont un UID commun -5. Ces deux enregistrements peuvent être considérés comme une seule unité. quatrième disque a un UID séparé, de sorte qu'il est une unité séparée

je besoin de produire une sortie dans un fichier de format CSV de telle sorte que

ID UID Name code  Address1 Name2 Code2 
10 5 jac 683501 A   Joe 727272 
13 6 mat 373737 C 

valeurs Name2 et Code2 sont de la deuxième rangée, Puisque l'UID est le même pour les deux premiers enregistrements, nous pouvons le considérer comme une seule unité.

Est-ce que quelqu'un peut donner des conseils pour générer ces enregistrements?

+0

Vous pouvez faire cela avec un [pivot] (http://msdn.microsoft.com/en-us/library/ms177410 (v = SQL.105) .aspx) . –

Répondre

2

Ce processus de transformation de données de lignes en colonnes est appelé PIVOT. Il y a plusieurs façons de le faire.

Vous pouvez utiliser un row_number() avec une fonction d'agrégation avec une expression CASE:

select min(id), 
    uid, 
    max(case when seq = 1 then name end) Name, 
    max(case when seq = 1 then code end) Code, 
    max(case when seq = 1 then Address1 end) Address1, 
    max(case when seq = 2 then name end) Name2, 
    max(case when seq = 2 then code end) code2, 
    max(case when seq = 2 then Address1 end) Address1_2 
from 
(
    select id, uid, address1, name, code, 
    row_number() over(partition by uid order by id) seq 
    from yourtable 
) d 
group by uid; 

Voir SQL Fiddle with Demo.

Vous pouvez utiliser à la fois la UNPIVOT et la fonction PIVOT:

select id, uid, 
    name1, code1, address1, name2, code2, address2 
from 
(
    select id, uid, col+cast(seq as varchar(10)) col, value 
    from 
    (
    select 
     (select min(id) 
     from yourtable t2 
     where t.uid = t2.uid) id, 
     uid, 
     cast(address1 as varchar(20)) address, 
     cast(name as varchar(20)) name, 
     cast(code as varchar(20)) code, 
     row_number() over(partition by uid order by id) seq 
    from yourtable t 
) d 
    unpivot 
    (
    value 
    for col in (address, name, code) 
) unpiv 
) src 
pivot 
(
    max(value) 
    for col in (name1, code1, address1, name2, code2, address2) 
) piv; 

Voir SQL Fiddle with Demo.

Enfin, si vous avez un nombre inconnu de valeurs pour chaque uid, vous pouvez utiliser SQL dynamique pour obtenir le résultat:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT ',' + QUOTENAME(col+(cast(seq as varchar(10)))) 
        from 
        (
         select row_number() over(partition by uid order by id) seq 
         from yourtable 
        ) d 
        cross apply 
        (
         select 'name', 1 union all 
         select 'code', 2 union all 
         select 'address', 3 
        ) c (col, so) 
        group by seq, col, so 
        order by seq, so 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT id, uid,' + @cols + ' 
      from 
      (
       select id, uid, col+cast(seq as varchar(10)) col, value 
       from 
       (
        select 
        (select min(id) 
        from yourtable t2 
        where t.uid = t2.uid) id, 
        uid, 
        cast(address1 as varchar(20)) address, 
        cast(name as varchar(20)) name, 
        cast(code as varchar(20)) code, 
        row_number() over(partition by uid order by id) seq 
        from yourtable t 
       ) d 
       unpivot 
       (
        value 
        for col in (address, name, code) 
       ) unpiv 
      ) x 
      pivot 
      (
       max(value) 
       for col in (' + @cols + ') 
      ) p ' 

execute(@query); 

Voir SQL Fiddle with Demo. Toutes les versions donneront un résultat:

| ID | UID | NAME1 | CODE1 | ADDRESS1 | NAME2 | CODE2 | ADDRESS2 | 
--------------------------------------------------------------------- 
| 10 | 5 | Jac | 683501 |  A | Joe | 727272 |  B | 
| 13 | 6 | mat | 373737 |  C | (null) | (null) | (null) | 
1

Essayez la jointure interne.

select u2.firstname,u2.col2, 
from users u 
inner join users u2 on u.userid=u2.userid 
where u.firstname=u2.lastname 
+0

substituez vos colonnes et faites-moi savoir si vous avez besoin d'aide. – bazz

+0

Je ne pense pas que la jointure interne fonctionne, nous ne pouvons pas joindre le prénom – user1557886

+0

L'auto-jointure ne fonctionne pas – user1557886

Questions connexes