代码之家  ›  专栏  ›  技术社区  ›  ddd

如何将两列中的不同值选为一列

  •  0
  • ddd  · 技术社区  · 4 年前

    在我的表中有两个与位置相关的列,如下所示

    | Service_No | A_LOC | Z_LOC |
    |------------|-------|-------|
    | 001        | A     | B     |
    | 002        | A     | C     |
    | 003        | Null  | C     |
    | 004        | F     | B     |
    

    如何选择列的不同值 A_LOC Z_LOC 合并成一张单子?此查询的结果将是:

    A, B, C, F
    
    2 回复  |  直到 4 年前
        1
  •  1
  •   eshirvana    4 年前

    有一种方法:

    select string_Agg(Location,',') as distinct_location_list
     from (
    select A_LOC Location FROM tablename
    union 
    select Z_LOC Location FROM tablename
    ) tt
    
        2
  •  1
  •   Srijon Chakraborty    4 年前

    我想,我有一个快速的解决方案给你。但是,您可以优化它,也可以用不同的方法来实现它。

    DECLARE @YourTable TABLE
    (
    Service_No VARCHAR(30),
    A_LOC  VARCHAR(30),
    Z_LOC  VARCHAR(30)
    );
    INSERT INTO  @YourTable Values('001','A','B');
    INSERT INTO  @YourTable Values('002','A','C');
    INSERT INTO  @YourTable Values('003',NULL,'C');
    INSERT INTO  @YourTable Values('004','F','B');
    
    DECLARE @TempTable TABLE(FINALDATA  VARCHAR(30));
    
    INSERT INTO @TempTable
    SELECT A_LOC FROM @YourTable WHERE A_LOC IS NOT NULL;
    INSERT INTO @TempTable
    SELECT Z_LOC FROM @YourTable WHERE Z_LOC IS NOT NULL;
    
    SELECT DISTINCT FINALDATA FROM @TempTable;
    

    注: 这段代码是用SQL SERVER编写的。请检查代码并告诉我。

        3
  •  0
  •   Johnny Fitz    4 年前

    或者,如果string\u agg函数不可用,请尝试此方法。

    select 
      STUFF(
             (SELECT ', ' + Loc FROM 
                (
                select distinct A_Loc  as Loc from @t 
                union 
                select distinct Z_Loc  as Loc from @t 
                ) t2 
              FOR XML PATH (''))
            , 1, 1, '') 
    
        4
  •  0
  •   Gordon Linoff    4 年前

    我建议使用 apply 然后过滤和 distinct 惯性导航与制导:

    select string_agg(loc, ',')
    from (select distinct loc
          from t cross apply
               (values (a_loc), (z_loc)) v(loc)
          where loc is not null
         ) v;