¿Aplanar un conjunto de registros en SQL Server?
-
05-07-2019 - |
Pregunta
Supongamos que obtienes un juego de registros como el siguiente:
| ID | Foo | Bar | Red |
|-----|------|------|------|
| 1 | 100 | NULL | NULL |
| 1 | NULL | 200 | NULL |
| 1 | NULL | NULL | 300 |
| 2 | 400 | NULL | NULL |
| ... | ... | ... | ... | -- etc.
Y tú quieres:
| ID | Foo | Bar | Red |
|-----|-----|-----|-----|
| 1 | 100 | 200 | 300 |
| 2 | 400 | ... | ... |
| ... | ... | ... | ... | -- etc.
Podrías usar algo como:
SELECT
ID,
MAX(Foo) AS Foo,
MAX(Bar) AS Bar,
MAX(Red) AS Red
FROM foobarred
GROUP BY ID
Ahora, ¿cómo podrías lograr algo similar cuando Foo, Bar y Red son VARCHAR?
| ID | Foo | Bar | Red |
|-----|----------|---------|---------|
| 1 | 'Text1' | NULL | NULL |
| 1 | NULL | 'Text2' | NULL |
| 1 | NULL | NULL | 'Text3' |
| 2 | 'Test4' | NULL | NULL |
| ... | ... | ... | ... | -- etc.
Para:
| ID | Foo | Bar | Red |
|-----|----------|---------|---------|
| 1 | 'Text1' | 'Text2' | 'Text3' |
| 2 | 'Text4' | ... | ... |
| ... | ... | ... | ... | -- etc.
Actualmente trabaja principalmente con SQL Server 2000; pero tiene acceso a los servidores de 2005.
Solución
No tengo acceso a un cuadro SQL2K en el momento, pero seleccionar max (columna) funcionará en nvarchars en 2005. El único problema será si tiene varios valores de texto debajo de cada columna para cada ID en su tabla original ...
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
devuelve
ID Foo Bar Red
----------- ---------- ---------- ----------
1 Text1 Text2 Text3
2 Text4 NULL NULL
Otros consejos
La consulta que tenía anteriormente funciona bien para los campos VARCHAR como lo hizo para los campos INT. Sin embargo, el problema con su consulta es que si tiene dos filas con el mismo ID, y ambas filas tenían algo en el " Foo " Columna, solo se mostrará la que tenga el valor más alto (tanto para INT como para VARCHAR).