Вопрос

Допустим, вы получаете набор записей, подобный следующему:

| 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).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top