PostgreSQL-创建临时列而不是多行

PostgreSQL-创建临时列而不是多行,sql,postgresql,Sql,Postgresql,我正在处理PostgreSQL客户记录 我的任务是导出客户记录 除了有联系信息的客户之外,我还有一张桌子 每行电话、价值或电子邮件、价值等一个联系人项目 当我加入并关联数据时,如果每个客户的通信类型超过1种,例如电话和电子邮件,我会为每个客户ID提取多个记录 我怎样才能不为每种通信类型再做一行,而是将信息放入一个临时列,如电话列、传真列和电子邮件列,然后每个客户只有一行 编辑-你们是大师 带列的数据库表: account { id accountid title (company n

我正在处理PostgreSQL客户记录

我的任务是导出客户记录

除了有联系信息的客户之外,我还有一张桌子

每行电话、价值或电子邮件、价值等一个联系人项目

当我加入并关联数据时,如果每个客户的通信类型超过1种,例如电话和电子邮件,我会为每个客户ID提取多个记录

我怎样才能不为每种通信类型再做一行,而是将信息放入一个临时列,如电话列、传真列和电子邮件列,然后每个客户只有一行

编辑-你们是大师

带列的数据库表:

account {
  id
  accountid
  title (company name?)
  shiptoaddress_id (links to address table)
  billtoaddress_id (links to address table)
}

address {
  city
  country
  state
  name (company name?)
  street1
  street2
  street3
  zip
  id
}

comlink {
  isdeleted
  type [Phone,Fax,E-mail,Cell,IM,FaceBook,Twitter,LinkedIn,Web Site,Other]
  value
  id
  party_id (links to party table)
}

party {
  isdeleted [t,f]
  firstname
  lastname
  prefix
  salutation
  suffix
  id
  address_id
  jobtitle_id
}

party_comlinks {
  party_id (links to party table ex: fname lname...)
  comlinks_id (links to comlink table phone, email, etc 1 item per row)
}
因此,我要做的是使用以下数据拉取所有客户:

customer.id,customer.accountid,customer.title,shipping.name,shipping.street1,shipping.street2,shipping.street3,shipping.city,shipping.state,shipping.zip,billing.city,billing.state,billing.zip,party.contactperson作为party.firstname+party.lastname并具有电话、电子邮件、传真

我不确定这是否可能,因为在系统中,我认为您可以有多个配送信息、账单信息、每个客户的联系信息。。。但是,如果每个发货信息和账单信息相同,我只需要一行电话、电子邮件、传真等,而不是多行电话、电子邮件、传真等

像泥一样清澈,对吗-

编辑-现在可能已经收到了,但仍将感谢您的输入


实际上,内部连接不是我需要的。。。我需要按如下所述进行左连接。

您必须通过多次显式连接联系人表来完成此操作。现在有一种方法可以根据数据拥有一组动态的输出列

例如:

SELECT customers.name, phone_contacts.value AS phone, fax_contacts.value AS fax, ...
FROM customers
  LEFT JOIN (SELECT * FROM contacts WHERE contact_type = 'phone') AS phone_contacts ON ...
  LEFT JOIN (SELECT * FROM contacts WHERE contact_type = 'fax') AS fax_contacts ON ...

要做到这一点,您必须多次显式地加入联系人表。现在有一种方法可以根据数据拥有一组动态的输出列

例如:

SELECT customers.name, phone_contacts.value AS phone, fax_contacts.value AS fax, ...
FROM customers
  LEFT JOIN (SELECT * FROM contacts WHERE contact_type = 'phone') AS phone_contacts ON ...
  LEFT JOIN (SELECT * FROM contacts WHERE contact_type = 'fax') AS fax_contacts ON ...

您能否向我们展示一个数据示例、您尝试过的查询以及正确的结果是什么样子的?请将表的定义添加为CREATETABLE语句。一些示例数据和基于该数据的预期输出。格式化文本,请给我们看一个数据示例,您尝试了什么查询,以及正确的结果是什么样的?将表的定义添加为CREATETABLE语句。一些示例数据和基于该数据的预期输出。请格式化文本,从联系人中选择左连接*,其中联系人类型='phone'可以简化为联系人上的左连接联系人类型='phone',这是一个很好的例子,我可能可以尝试一下,但不管它是否有效,都不是绝对肯定的。LEFT JOIN SELECT*FROM contacts,其中contact_type='phone'可以简化为contact_type='phone'上的LEFT JOIN contacts,这是一个很好的例子,我可能可以尝试一下,但如果它有效与否,就不是绝对肯定的。