Сгладить набор записей в SQL Server?
-
05-07-2019 - |
Вопрос
Допустим, вы получаете набор записей, подобный следующему:
| ID | Foo | Bar | Red |
|-----|------|------|------|
| 1 | 100 | NULL | NULL |
| 1 | NULL | 200 | NULL |
| 1 | NULL | NULL | 300 |
| 2 | 400 | NULL | NULL |
| ... | ... | ... | ... | -- etc.
И ты хочешь:
| ID | Foo | Bar | Red |
|-----|-----|-----|-----|
| 1 | 100 | 200 | 300 |
| 2 | 400 | ... | ... |
| ... | ... | ... | ... | -- etc.
Вы могли бы использовать что-то вроде:
SELECT
ID,
MAX(Foo) AS Foo,
MAX(Bar) AS Bar,
MAX(Red) AS Red
FROM foobarred
GROUP BY ID
Теперь, как вы могли бы добиться аналогичного, когда Foo, Bar и Red являются 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.
В настоящее время работает в основном с SQL Server 2000;но у вас есть доступ к серверам 2005 года.
Решение
В данный момент у меня нет доступа к окну SQL2K, но select max (столбец) будет работать с nvarchars в 2005 году.Единственная проблема будет заключаться в том, что у вас будет несколько текстовых значений под каждым столбцом для каждого идентификатора в вашей исходной таблице...
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
ВОЗВРАТ
ID Foo Bar Red
----------- ---------- ---------- ----------
1 Text1 Text2 Text3
2 Text4 NULL NULL
Другие советы
Приведенный выше запрос отлично работает для полей VARCHAR, как и для полей INT.Проблема с вашим запросом, однако, заключается в том, что если у вас есть две строки с одинаковым идентификатором, и в обеих этих строках что-то было в столбце "Foo", то будет отображаться только та, у которой наибольшее значение (как для INT, так и для VARCHAR).