Achatar um conjunto de registros no SQL Server?
-
05-07-2019 - |
Pergunta
dizer que você começa um conjunto de registros como o seguinte:
| ID | Foo | Bar | Red |
|-----|------|------|------|
| 1 | 100 | NULL | NULL |
| 1 | NULL | 200 | NULL |
| 1 | NULL | NULL | 300 |
| 2 | 400 | NULL | NULL |
| ... | ... | ... | ... | -- etc.
E você quer:
| ID | Foo | Bar | Red |
|-----|-----|-----|-----|
| 1 | 100 | 200 | 300 |
| 2 | 400 | ... | ... |
| ... | ... | ... | ... | -- etc.
Você pode usar algo como:
SELECT
ID,
MAX(Foo) AS Foo,
MAX(Bar) AS Bar,
MAX(Red) AS Red
FROM foobarred
GROUP BY ID
Agora, como pode você conseguir semelhante quando Foo, Bar e Red são 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.
Atualmente trabalhando principalmente com o SQL Server 2000; mas têm acesso a 2005 servidores.
Solução
Eu não tenho acesso a uma caixa SQL2K em cima da hora, mas selecione max (coluna) irá funcionar em nvarchars em 2005. O único problema será se você tiver vários valores de texto sob cada coluna para cada id em sua tabela 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
volta ??p>
ID Foo Bar Red
----------- ---------- ---------- ----------
1 Text1 Text2 Text3
2 Text4 NULL NULL
Outras dicas
A consulta que tinha acima funciona muito bem para campos VARCHAR como fez para campos INT. O problema com a sua consulta, porém, é que se você tiver duas linhas com o mesmo ID, e ambas as linhas tinha algo na coluna "Foo", então só aquele com o maior valor (tanto para INT e VARCHAR) será exibido .