我想知道你能帮我吗?我是SQL的新手,我真的很难处理这个查询。我环顾了四周,但作为新手,我很快就迷惑了!
我继承了一组企业客户的不同地址表。该表位于Oracle12c服务器上,我使用的是SQL Developer。
我想将此信息附加到另一个查询的末尾,这样人们就可以更容易地在最终报告中查看单个客户的所有相关信息。
表格的布局是这样的:
| 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 |我想要创建的是:
| 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种:SITE、BUILDER和ARCHITECT。因此,与其让每个ADDRESS_TYPE在每个CUST_ID上占一行,不如让每个CUST_ID占一行,每个ADDRESS_TYPE的地址信息作为额外的列。我将使用CUST_ID将结果连接到另一个查询。
我不知道我是否应该尝试具有多个连接的东西,或者我是否可以做一些子查询?
非常感谢您的时间和帮助,我真的很感激!
发布于 2017-07-29 04:50:17
您还可以使用连接
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'发布于 2017-07-29 04:38:05
您可以使用条件聚合:
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;发布于 2017-07-30 07:51:14
或者你可以使用PIVOT (在不同的解决方案中详述)
Link to SQLFiddle
select * from addresses
pivot (
MAX(CONTACT_NAME) CONTACT_NAME,
MAX(ADDRESS) ADDRESS,
MAX(CITY) CITY
FOR ADDRESS_TYPE IN ('SITE','BUILDER','ARCHITECT'));@OP :我对时间很好奇。我想一定像聚合方法一样。
https://stackoverflow.com/questions/45381984
复制相似问题