2014-07-10 46 views
0

我当前的查询是重新编写的Oracle SQL查询

SELECT 
STATUS, 
POSTAL_CODE, 
CITY_STATE, 
    (case when SERVICE = 1 THEN org_id) end) AS WATER, 
    (case when SERVICE = 2 THEN org_id) end) AS COFFEE, 
    (case when SERVICE = 3 THEN org_id) end) AS FILTRATION 
FROM MAP 
WHERE POSTAL_CODE = 02216 

的结果:

Status  Zip  City_State Water Coffee Filtration 

Serviceable 02216 BOSTON,MA. BEL null null 
Serviceable 02216 BOSTON,MA. null BDG null 
Serviceable 02216 BOSTON,MA. null null BEL 

我想这个结果折叠成一排。是否有一些优雅的选择,我可以使用,或者我应该使用函数,如XMLAGG,XMLELEMENT为了将结果折叠成一行?另外,是否有更好的方法来编写这些案例陈述?可能使用where子句?

试过a_horse_with_no_name的建议如下:

SELECT STATUS, 
     POSTAL_CODE, 
     SERVICE_ITEM_ID, 
     MAX((case when SERVICE = 1 THEN org_id)) AS WATER, 
     MAX((case when SERVICE = 2 THEN org_id)) AS COFFEE, 
     MAX((case when SERVICE = 3 THEN org_id)) AS FILTRATION 
FROM MAP 
WHERE POSTAL_CODE = '02216' 
GROUP BY STATUS, POSTAL_CODE, SERVICE_ITEM_ID; 

STATUS POSTAL_CODE SERVICE_ITEM_ID WATER COFFEE FILTRATION 
Serviceable 02216 1300   BEL  null  null 
Serviceable 02216 1302   null BDG   null 
Serviceable 02216 1304   null null  BEL 

仍然相同的结果。

回答

2

使用group by和聚合函数:

SELECT STATUS, 
     POSTAL_CODE, 
     CITY_STATE, 
     max(case when SERVICE = 1 THEN org_id end) AS WATER, 
     max(case when SERVICE = 2 THEN org_id end) AS COFFEE, 
     max(case when SERVICE = 3 THEN org_id end) AS FILTRATION 
FROM MAP 
WHERE POSTAL_CODE = '02216' 
GROUP BY status, postal_code, city_state 

作为聚集体忽略NULL值,该被还原成单排。


我认为postal_codevarchar列,为此你也应该把它比作一个字符串/ VARCHAR值。 02216是一个数字(2216),而'02216'是一个字符串。

+0

我需要为一排,我不知道你有没有错字有“成一列。”? –

+0

@NomanArain:是的,这是一个错字,纠正了 –

+0

你怎么做最大的varchar? –

0

尝试使用PIVOT(我认为它仅适用于Oracle 11g,并且尽管如此)。另外,我对他们很陌生,但我99%确定这是你如何将所有东西都放在一行上的方式。

SELECT * FROM ( SELECT STATUS, POSTAL_CODE, CITY_STATE, (max(case when SERVICE = 1 THEN org_id end) AS WATER || max(case when SERVICE = 2 THEN org_id end) AS COFFEE || max(case when SERVICE = 3 THEN org_id end) AS FILTRATION) AS S1 FROM MAP WHERE POSTAL_CODE = '02216' GROUP BY status, postal_code, city_state ) PIVOT ( S1 FOR S1 IN ('WATER', 'COFFEE', 'FILTRATION') )

+0

嘿,我一直在尝试但是我没有理解它 –

+0

我在FOR ORG_ID IN('1','2','3')得到“这里只允许使用简单的列名”错误 –

+0

希望有人可以在这里帮忙。 '新来支撑自己。尝试阅读:http://www.oracle.com/technetwork/articles/sql/11g-pivot-097235.html – dh2002