Question

Supposons que vous obteniez un jeu d'enregistrements ressemblant à ceci:

| ID  | Foo  | Bar  | Red  |
|-----|------|------|------|
| 1   | 100  | NULL | NULL |
| 1   | NULL | 200  | NULL |
| 1   | NULL | NULL | 300  |
| 2   | 400  | NULL | NULL |
| ... | ...  | ...  | ...  | -- etc.

Et vous voulez:

| ID  | Foo | Bar | Red |
|-----|-----|-----|-----|
| 1   | 100 | 200 | 300 |
| 2   | 400 | ... | ... |
| ... | ... | ... | ... | -- etc.

Vous pouvez utiliser quelque chose comme:

SELECT
  ID,
  MAX(Foo) AS Foo,
  MAX(Bar) AS Bar,
  MAX(Red) AS Red
FROM foobarred
GROUP BY ID

Maintenant, comment pourriez-vous accomplir la même chose quand Foo, Bar et Red sont VARCHAR?

| ID  | Foo      | Bar     | Red     |
|-----|----------|---------|---------|
| 1   | 'Text1'  | NULL    | NULL    |
| 1   | NULL     | 'Text2' | NULL    |
| 1   | NULL     | NULL    | 'Text3' |
| 2   | 'Test4'  | NULL    | NULL    |
| ... | ...      | ...     | ...     | -- etc.

À:

| ID  | Foo      | Bar     | Red     |
|-----|----------|---------|---------|
| 1   | 'Text1'  | 'Text2' | 'Text3' |
| 2   | 'Text4'  | ...     | ...     |
| ... | ...      | ...     | ...     | -- etc.

travaille actuellement principalement avec SQL Server 2000; mais avoir accès aux serveurs de 2005.

Était-ce utile?

La solution

Je n'ai pas accès à une boîte SQL2K à la minute actuelle mais sélectionnez max (column) fonctionnera sur nvarchars en 2005. Le seul problème sera si vous avez plusieurs valeurs de texte sous chaque colonne pour chaque identifiant de votre table d'origine ...

CREATE TABLE Flatten (
    id int not null,
    foo Nvarchar(10) null,
    bar Nvarchar(10) null,
    red Nvarchar(10) null)

INSERT INTO Flatten (ID, foo, bar, red) VALUES (1, 'Text1', null, null)
INSERT INTO Flatten (ID, foo, bar, red) VALUES (1, null, 'Text2', null)
INSERT INTO Flatten (ID, foo, bar, red) VALUES (1, null, null, 'Text3')
INSERT INTO Flatten (ID, foo, bar, red) VALUES (2, 'Text4', null, null)



SELECT 
    ID, 
    max(foo),
    max(bar),
    max(red)
FROM
Flatten
GROUP BY ID

retourne

ID          Foo        Bar        Red
----------- ---------- ---------- ----------
1           Text1      Text2      Text3
2           Text4      NULL       NULL

Autres conseils

La requête ci-dessus fonctionne parfaitement pour les champs VARCHAR comme pour les champs INT. Le problème de votre requête est cependant que si vous avez deux lignes avec le même ID et que ces deux lignes ont quelque chose dans le champ "Foo". colonne, seule celle qui a la valeur la plus élevée (à la fois pour INT et VARCHAR) sera affichée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top