代码之家  ›  专栏  ›  技术社区  ›  Jonathan Lonowski

在SQL Server中展平记录集?

  •  1
  • Jonathan Lonowski  · 技术社区  · 16 年前

    假设您得到如下记录集:

    | 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 回复  |  直到 16 年前
        1
  •  0
  •   Eoin Campbell    16 年前

    我现在不能访问sql2k框,但select max(column)将在2005年用于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
    
        2
  •  1
  •   Timothy Khouri    16 年前

    上面的查询对varchar字段的效果和对int字段的效果一样好。但是,您的查询存在的问题是,如果有两行具有相同的ID,并且这两行在“foo”列中都有一些内容,那么只会显示值最高的行(int和varchar都有)。