【问题标题】:SQL to fetch row into column based on conSQL基于con将行提取到列中
【发布时间】:2018-11-16 16:00:49
【问题描述】:

我在下面的结构中有一个表。我想创建一个可以按特定顺序获取记录的 sql。

Name	Phone	B.Email           P.Email
Jack	12      ab12@test.com	  a21@test.com
Ram	12345   null              Ram@test.com
Raja    543     Raj@test.om       null
Rik     122     null		  null

我想要按以下顺序输出

Name	Phone	        EMAIL			IsPrimary	EmailType
Jack	123		ab12@test.com		Y		B
Jack	123		a21@test.com		N		P
Ram	321	        Ram@test.com		Y		P
Raja	543		Raj@test.om		Y		B

如果有 B.Email,那么它将是主要的,否则 P.Email 将是主要的。如果两封电子邮件都为空,则该记录将不会出现在输出中。

【问题讨论】:

  • 我在我们的输出中看到 Ram IsPrimary is 'N' ...请澄清

标签: sql oracle etl


【解决方案1】:

这是你想要的吗?

order by phone, name, isprimary desc

【讨论】:

    【解决方案2】:

    我使用 UNION 让首先使用 b.email 的人,然后使用 p.email 和 CASE 的人来整理主要和类型

    SELECT name, phone, b.email EMAIL, 'Y' IsPrimary,
        CASE WHEN b.email  IS NULL THEN 'P'
        ELSE 'B' 
        END EmailType
    FROM mail
    WHERE b.email IS NOT NULL 
    UNION 
    SELECT name, phone,  p.email EMAIL, 
       CASE WHEN b.email IS NULL THEN 'Y'
       ELSE 'N' 
       END IsPrimary,
       CASE WHEN b.email  IS NULL THEN 'P'
       ELSE 'B' 
       END EmailType
    FROM mail
    WHERE p.email IS NOT NULL 
    ORDER BY name
    

    【讨论】:

      【解决方案3】:

      其他答案很接近,但我认为它们的输出都有错误。

      不确定这是什么 SQL 引擎,这是我对 MySQL5.6 的回答:

      SELECT name,
             phone,
             CASE WHEN BEmail IS NOT NULL THEN BEMail ELSE PEmail END as EMAIL,
             'Y' as IsPrimary,
             CASE WHEN BEmail IS NOT NULL THEN 'B' ELSE 'P' END as EmailType
      FROM table_name t
      WHERE NOT (BEmail IS NULL AND PEmail IS NULL)
      UNION ALL
      SELECT name, phone, PEmail, 'N', 'P'
      from table_name
      WHERE BEmail IS NOT NULL
      AND PEmail IS NOT NULL
      ORDER BY Name;
      

      请注意,我已将 B.Email 更改为 BEmail,将 P.Email 更改为 PEMail,并且该表名为“table_name”。

      SQL Fiddle here

      【讨论】:

        【解决方案4】:

        试试下面的查询:

        create table     Table3
        (Name  varchar2(20),
        phone number,
        "B.mail" varchar2(50),
        "P.mail" varchar2(50));
        
        insert into Table3 values ('Jack',12,'ab12@test.com','a21@test.com');
        insert into Table3 values ('Ram',12345,null,'Ram@test.com');
        insert into Table3 values ('Raja',543,'Raj@test.com',null);
        insert into Table3 values ('Rik',122,null,null);
        
        SELECT Name, Phone, COALESCE("B.mail","P.mail") Email, CASE WHEN "B.mail" IS NOT NULL THEN 'Y'  ELSE 'N' END as IsPrimary,CASE WHEN "B.mail" IS NOT NULL THEN 'B'  ELSE 'P' END as EmailType
        FROM Table3 t
        where "B.mail" IS NOT NULL OR "P.mail" IS NOT NULL 
        UNION 
        SELECT Name, Phone, COALESCE("P.mail","B.mail") Email, CASE WHEN "P.mail" IS NOT NULL THEN 'N'  ELSE 'Y' END as IsPrimary,CASE WHEN "P.mail" IS NOT NULL THEN 'P'  ELSE 'B' END as EmailType
        FROM Table3 t
        where "B.mail" IS NOT NULL OR "P.mail" IS NOT NULL 
        

        【讨论】:

          猜你喜欢
          • 2023-03-29
          • 2018-10-28
          • 1970-01-01
          • 2010-10-30
          • 2022-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多