2008-10-30 78 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)的值。