【问题标题】:UNION operator to seperate the columns based on the flag valueUNION 运算符根据标志值分隔列
【发布时间】:2018-11-01 06:12:03
【问题描述】:

我有如下表格。

Name    Primary phone   Primary Ind
Manju       11              Y
Manju       22              N
Tyagi       33              N
Tyagi       44              Y

我希望我的结果根据上表中的Primary Ind 标志显示如下。基本上,如果主要指标是“Y”电话号码应该转到“主要电话”。如果为“N”,则应转到“非主要”

Name    Primary Phone   Non Primary
manju        11               22
Tyagi        44               33

我需要使用 select 和 UNION 来实现这一点。这是给我的任务。有人可以帮忙吗?

【问题讨论】:

  • 谁给你这个任务?联合是解决此问题所需的最后一件事,为此使用联合甚至是个坏主意
  • 根据我对您的样本数据的了解,Manju 有可能拥有超过 2 部手机,例如 3 部非主要手机,您想要的结果如何?

标签: sql-server select union


【解决方案1】:

自加入

 select t1.name, t1.phone as primary, t2.phone as non 
   from table t1 
   join table t2 
     on t2.name = t1.name 
    and t1.ind = 'y' 
    and t2.ind = 'n'

【讨论】:

  • 我喜欢你的解决方案和我想这样做的方式,唯一的事情是我认为这是一个家庭作业,需要使用 UNION 的描述方式。是这样吗,@unnikrishnan?
  • @JohnBus​​tos 不相信给学生人为约束是一件好事。
  • 哦,同意,只是指出问题中的问题。
【解决方案2】:

不是我处理这个问题的方式,而是要求:

只需生成两组数据,一组为 Y,一组为 N,并集并获得每组的最大值。该最大值假定每条记录只有 2 个电话号码(主要和非主要各一个)

SELECT name
     , max([Primary Phone]) as [Primary Phone]
     , max([non Primary] as [Non Primary)
FROM (SELECT name, [Primary phone], null as [non Primary]
      FROM TABLE
      WHERE [Primary Ind] = 'Y'

      UNION ALL

      SELECT name, Null as [Primary Phone], [Primary Phone ]
      FROM TABLE
      WHERE [Primary Ind] = 'N') DT
GROUP BY name

Union 与 union all 取决于您是否需要消除重复项,如果您知道不联合 all 会稍微快一些。

【讨论】:

    【解决方案3】:

    联合不是必需的,但你仍然需要它,

    select name,primaryphone,nonprimary from (
        select  name,primaryphone
        from 
        (
        select name,primaryphone,'primary' PrimaryInd from yourtable where primaryind='Y'
        union
        select name,primaryphone,'non primary' from yourtable where primaryind='N'
          ) a
          where primaryind='primary')a1 join 
    
    
         ( select  name as name1,primaryphone as nonprimary
        from 
        (
        select name,primaryphone,'primary' PrimaryInd from yourtable where primaryind='Y'
        union
        select name,primaryphone,'non primary' from yourtable where primaryind='N'
          ) a
          where primaryind='non primary')a2
         on a1.name=a2.name1
    

    检查这个-http://sqlfiddle.com/#!18/5a8db/23

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-25
      • 2013-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多