2013-03-03 3 views
1

Mon rapport SQL Server 2008 me renvoie plusieurs lignes dans une table. Une instruction select simple renvoie deux colonnes, l'une est le numéro d'enregistrement, l'autre est un secteur. La colonne de secteur peut contenir l'une des 6 valeurs différentes.SSRS Plusieurs lignes de données

EDIT: NULL Les valeurs sont autorisées dans la colonne de secteur.

Je veux que ces données soient dans une ligne dans ma table. Disons que le numéro d'enregistrement 1 a le secteur A, le secteur C et le secteur E et le registre 2 a le secteur B et le secteur C et le registre 3 n'en a aucun.

Je suis après trois lignes de données. J'ai aussi besoin de l'afficher de deux façons. Un pour que tous les secteurs apparaissent dans la même cellule séparés par des virgules. L'autre est une cellule séparée pour chaque catégorie

Record number | Sector 
1    | A, C, E 
2    | B, C 
3    | 

Ou

Record Number | Sector A | Sector B | Sector C | Sector D | Sector E 
1    | A  |   | C  |   | E 
2    |   | B  | C  |   | 
3    |   |   |   |   | 

Au moment de mon rapport me donne 6 lignes.

Record Number | Sector 
1    | A 
1    | C 
1    | E 
2    | B 
2    | C 
3    | 

Existe-t-il un moyen de contourner ce problème? J'utilise le concepteur de requêtes plutôt que d'écrire les instructions SQL.

+0

Veuillez indiquer à quoi doit ressembler votre résultat de requête final. Je ne sais pas ce que vous voulez dire lorsque vous dites que vous en avez besoin «de deux façons». Deux requêtes distinctes ou combinées en un résultat. Aussi, ne savez pas ce que vous voulez dire lorsque vous utilisez des virgules. Est-ce un séparateur de colonnes ou de séparer plusieurs éléments dans une liste? – Tim

+0

Lit les requêtes PIVOT dans SQL Server et rend compte par la suite. – Tim

+0

Combien de lignes y a-t-il dans la table d'origine? La seule ligne que vous voulez comme résultat final pourrait être très très très longue. – Tim

Répondre

2

Pour obtenir le premier résultat souhaité avec la liste de valeurs sector séparées par des virgules, vous devez utiliser FOR XML PATH et STUFF. Le code sera:

select t1.recordnumber, 
    STUFF((SELECT ', ' + t2.sector 
     from yourtable t2 
     where t1.recordnumber = t2.recordnumber 
      FOR XML PATH ('')) 
      , 1, 1, '') AS Sector 
from yourtable t1 
group by t1.recordnumber 

Voir SQL Fiddle with Demo. Le résultat est:

| RECORDNUMBER | SECTOR | 
--------------------------- 
|   1 | A, C, E | 
|   2 |  B, C | 
|   3 | (null) | 

ensuite pour obtenir le résultat de la recordNumber en une seule rangée, vous pouvez utiliser la fonction PIVOT:

select * 
from 
(
    select recordNumber, sector 
    from yourtable 
) src 
pivot 
(
    max(sector) 
    for sector in (A, B, C, D, E) 
) piv; 

Voir SQL Fiddle with Demo. Le résultat de cette requête est:

| RECORDNUMBER |  A |  B |  C |  D |  E | 
------------------------------------------------------------- 
|   1 |  A | (null) |  C | (null) |  E | 
|   2 | (null) |  B |  C | (null) | (null) | 
|   3 | (null) | (null) | (null) | (null) | (null) | 
+0

Est-ce que quelque chose comme ceci peut être fait dans Query Designer dire avec un champ calculé? – user1957907

+0

@ user1957907 Vous devriez pouvoir placer ces requêtes dans le concepteur de requêtes. – Taryn

+0

Salut L'inconvénient de cela est que vous devez vous en tenir au côté de la programmation de Query Designer si vous changez le rapport dans le futur. Je pensais peut-être que je pourrais faire un champ calculé ou quelque chose en particulier sur la table 2? – user1957907

Questions connexes