Сгладить набор записей в SQL Server? - PullRequest
1 голос
/ 30 октября 2008

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

| 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 года.

Ответы [ 2 ]

1 голос
/ 30 октября 2008

Вышеупомянутый запрос прекрасно работает для полей VARCHAR, как и для полей INT. Однако проблема с вашим запросом состоит в том, что если у вас есть две строки с одинаковым идентификатором, и у обеих этих строк есть что-то в столбце «Foo», то будет отображаться только та, которая имеет наибольшее значение (как для INT, так и для VARCHAR). .

0 голосов
/ 30 октября 2008

У меня нет доступа к блоку SQL2K в данный момент, но выбор 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
...