2008-10-30 69 views
1

說你得到一個記錄如下:在SQL Server中展開記錄集?

| 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服務器。

回答

0

我無法在一分鐘內訪問SQL2K框,但在2005年選擇max(列)將在nvarchars上工作。唯一的問題是,如果您的原始文檔中的每個id的每列下有多個文本值表...

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 
+0

拿着出去2K解決方案。但是,似乎沒有人來。 ;) – 2009-09-28 20:38:29

1

上面的查詢對於VARCHAR字段的處理方式就像處理INT字段一樣正常。但是,查詢的問題在於,如果您有兩個具有相同ID的行,並且這兩行在「Foo」列中有某些內容,則只會顯示具有最高值(對於INT和VARCHAR)的值。