当前位置: 首页 > 面试题库 >

根据第三列中的类型代码将列分为两列

东方俊杰
2023-03-14
问题内容

我的SQL很生锈。我正在尝试转换此表:

+----+-----+--------------+-------+
| ID | SIN |   CONTACT    | TYPE  |
+----+-----+--------------+-------+
|  1 | 737 | b@bacon.com  | email |
|  2 | 760 | 250-555-0100 | phone |
|  3 | 737 | 250-555-0101 | phone |
|  4 | 800 | 250-555-0102 | phone |
|  5 | 850 | l@lemon.com  | email |
+----+-----+--------------+-------+

进入此表:

+----+-----+--------------+-------------+
| ID | SIN |    PHONE     |    EMAIL    |
+----+-----+--------------+-------------+
|  1 | 737 | 250-555-0101 | b@bacon.com |
|  2 | 760 | 250-555-0100 |             |
|  4 | 800 | 250-555-0102 |             |
|  5 | 850 |              | l@lemon.com |
+----+-----+--------------+-------------+

我写了这个查询:

SELECT *
  FROM (SELECT *
          FROM people
         WHERE TYPE = 'phone') phoneNumbers
       FULL JOIN (SELECT *
                    FROM people
                   WHERE TYPE = 'email') emailAddresses
          ON phoneNumbers.SIN = emailAddresses.SIN;

产生:

+----+-----+--------------+-------+------+-------+-------------+--------+
| ID | SIN |   CONTACT    | TYPE  | ID_1 | SIN_1 |  CONTACT_1  | TYPE_1 |
+----+-----+--------------+-------+------+-------+-------------+--------+
|  2 | 760 | 250-555-0100 | phone |      |       |             |        |
|  3 | 737 | 250-555-0101 | phone |    1 |   737 | b@bacon.com | email  |
|  4 | 800 | 250-555-0102 | phone |      |       |             |        |
|    |     |              |       |    5 |   850 | l@lemon.com | email  |
+----+-----+--------------+-------+------+-------+-------------+--------+

我知道我可以选择所需的列,但SIN列不完整。我似乎记得我应该第三次加入表以获得完整的SIN列,但是我不记得怎么做。

如何生成目标表(ID,SIN,PHONE,EMAIL)?

编辑和澄清:到目前为止,我非常感谢我收到的答案,但是作为SQL新手,我不熟悉您所使用的技术(条件语句,条件聚合和数据透视)。使用JOIN和SELECT不能做到这一点吗?请原谅我对此事的无知。(并不是我对高级技术不感兴趣,但我不想太快地采取行动。)


问题答案:

解决此问题的一种方法是条件聚合:

select min(ID), SIN, 
       max(case when type = 'phone' then contact end) as phone,
       max(case when type = 'email' then contact end) as email
from people t
group by sin;


 类似资料:
  • 我在excel中有一个列,其中包含名字、姓氏和职位名称的混合。唯一可以观察到的模式是——在每一组3行中,每第1行是名字,第2行是姓氏,第3行是工作标题。我想创建3个不同的列,并隔离此数据示例数据: 我想要:约翰,布什,经理,作为一行,分别放在名字,姓氏和职务下面的三个不同的栏中。像- 我们如何才能完成这项任务?

  • 问题内容: 我使用PostgreSQL9.4我有一个名为表列,并希望写一个查询将返回的时间范围在两个单独的列和。我试图像数组一样处理它,但是它不起作用: 当前表: 所需表: 问题答案: 使用 和。 像这样: 或您的示例:

  • 问题内容: 我有以下数据框: 现在,我想创建另一个列,其值在和之间最大。因此,我希望将其作为输出: 我试过了 : 但是,这会引发语法错误。我没有任何方法可以在熊猫中做到这一点。我的实际数据框太复杂了,因此我想为此提供一个通用的解决方案。有任何想法吗? 问题答案: 您可以使用: 解决方案: 或更简单的发现:

  • 本文向大家介绍js中DOM三级列表(代码分享),包括了js中DOM三级列表(代码分享)的使用技巧和注意事项,需要的朋友参考一下 效果图: 代码如下: 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持呐喊教程!

  • 问题内容: 我有一个带有一列的数据框,我想将其分为两列,其中一列标题为,另一列为 我的数据框df如下所示: 我不知道如何使用以达到分割行单元的目的。我可以用来添加一个新列,并用填充它hello。有任何想法吗? 问题答案: 对于以下简单情况: 我有一个带有定界符的文本列,我想要两列 最简单的解决方案是: 或者,你可以使用以下方法自动为拆分的每个条目创建一个带有一列的DataFrame: 如果字符串的

  • 问题内容: 可以说我有以下格式的JSON: 我试图避免自定义反序列化器,并尝试将上述JSON(称为Wrapper.java)反序列化为Java POJO。“类型”字段指示“对象”反序列化,即。type = foo表示使用Foo.java反序列化“ object”字段。(如果type = Bar,则使用Bar.java反序列化对象字段)。元数据/所有者将始终使用相同的反序列化方式,每个方法都使用一个