首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >创建SQL查询以将多个相关行组合在一起

创建SQL查询以将多个相关行组合在一起
EN

Stack Overflow用户
提问于 2017-07-29 04:33:44
回答 3查看 62关注 0票数 1

我想知道你能帮我吗?我是SQL的新手,我真的很难处理这个查询。我环顾了四周,但作为新手,我很快就迷惑了!

我继承了一组企业客户的不同地址表。该表位于Oracle12c服务器上,我使用的是SQL Developer。

我想将此信息附加到另一个查询的末尾,这样人们就可以更容易地在最终报告中查看单个客户的所有相关信息。

表格的布局是这样的:

代码语言:javascript
运行
复制
| CUST_ID | ADDRESS_TYPE | CONTACT_NAME | ADDRESS |  CITY  | ... |
------------------------------------------------------------------
|     1000|         SITE |      A SMITH |  A ROAD | A TOWN |
|     1000|      BUILDER |      B JONES |  B ROAD | B TOWN |
|     1000|    ARCHITECT |      A BROWN |  C ROAD | A CITY |
|     1001|         SITE |      B SMITH |  A LANE | C TOWN |
|     1001|    ARCHITECT |      D BROWN |  D ROAD | B CITY |
|     1002|         SITE |      E SMITH |  B LANE | D TOWN |
|     1002|    ARCHITECT |      C JONES |  B ROAD | A CITY |
|     1002|      BUILDER |      F SMITH |  C LANE | B TOWN |

我想要创建的是:

代码语言:javascript
运行
复制
| CUST_ID | SITE_NAME | SITE_ADDRESS | SITE_TOWN | BUILDER_NAME | BUILDER_ADDRESS | BUILDER_TOWN | ... |
|    1000 |   A SMITH |       A ROAD |    A TOWN |      B JONES |          B ROAD |       B TOWN | ... |
|    1001 |   B SMITH |       A LANE |    A TOWN |         NULL |            NULL |         NULL | ... |
|    1002 |   E SMITH |       B LANE |    D TOWN |      F SMITH |          C LANE |       B TOWN | ... |

我感兴趣的ADDRESS_TYPE有3种:SITEBUILDERARCHITECT。因此,与其让每个ADDRESS_TYPE在每个CUST_ID上占一行,不如让每个CUST_ID占一行,每个ADDRESS_TYPE的地址信息作为额外的列。我将使用CUST_ID将结果连接到另一个查询。

我不知道我是否应该尝试具有多个连接的东西,或者我是否可以做一些子查询?

非常感谢您的时间和帮助,我真的很感激!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-07-29 04:50:17

您还可以使用连接

代码语言:javascript
运行
复制
SELECT 
  BASE.CUST_ID,
  SITE.CONTACT_NAME AS SITE_NAME,
  SITE.ADDRESS AS SITE_ADDRESS,
  SITE.CITY AS SITE_CITY,
  BUILDER.CONTACT_NAME AS BUILDER_NAME,
  BUILDER.ADDRESS AS BUILDER_ADDRESS,
  BUILDER.CITY AS BUILDER_CITY,
  ARCHITECT.CONTACT_NAME AS ARCHITECT_NAME,
  ARCHITECT.ADDRESS AS ARCHITECT_ADDRESS,
  ARCHITECT.CITY AS ARCHITECT_CITY
FROM (SELECT DISTINCT CUST_ID FROM TABLE_YOU_DID_NOT_NAME) BASE
LEFT JOIN TABLE_YOU_DID_NOT_NAME SITE ON BASE.CUST_ID = SITE.CUST_ID AND SITE.ADDRESS_TYPE = 'SITE'
LEFT JOIN TABLE_YOU_DID_NOT_NAME BUILDER ON BASE.CUST_ID = BUILDER.CUST_ID AND BUILDER.ADDRESS_TYPE = 'BUILDER'
LEFT JOIN TABLE_YOU_DID_NOT_NAME ARCHITECT ON BASE.CUST_ID = ARCHITECT.CUST_ID AND ARCHITECT.ADDRESS_TYPE = 'ARCHITECT'
票数 1
EN

Stack Overflow用户

发布于 2017-07-29 04:38:05

您可以使用条件聚合:

代码语言:javascript
运行
复制
select cust_id,
       max(case when address_type = 'Site' then Contact_Name end) as site_name,
       max(case when address_type = 'Site' then Town end) as site_town,
       max(case when address_type = 'Site' then Address end) as site_address,
       max(case when address_type = 'Builder' then Contact_Name end) as builder_name,
       max(case when address_type = 'Builder' then Town end) as builder_town,
       max(case when address_type = 'Builder' then Address end) as builder_address,
      . . .
from t
group by cust_id;
票数 1
EN

Stack Overflow用户

发布于 2017-07-30 07:51:14

或者你可以使用PIVOT (在不同的解决方案中详述)

Link to SQLFiddle

代码语言:javascript
运行
复制
select * from addresses 
pivot ( 
  MAX(CONTACT_NAME) CONTACT_NAME, 
  MAX(ADDRESS) ADDRESS, 
  MAX(CITY) CITY 
  FOR ADDRESS_TYPE IN ('SITE','BUILDER','ARCHITECT'));

@OP :我对时间很好奇。我想一定像聚合方法一样。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45381984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档