2012-09-05 41 views
0

表有城市的数据和其支数/ ATM机获得多个聚合的单语句

CITY  TYPE  NAME 
---------------------------------- 
agra   atm   X 
agra   branch  X1 
delhi  atm   X2 
agra   atm   X3 
agra   atm   X4 
delhi  branch  X5 
chennai  branch  X6 

结果集预计是

CITY  ATM BRANCH 
------------------------------------ 
agra  3  1 
delhi  1  1 
chennai 0  1 

我们是否可以在一个select语句做到这一点。

回答

5

你可以这样做,因为在聚合条件求和:

select t.city, 
     sum(case when type = 'atm' then 1 else 0 end) as ATM, 
     sum(case when type = 'branch' then 1 else 0 end) as branch 
from t 
group by t.city 
+0

谢谢@Gordon Linoff。奇迹般有效 ! –

0

这是你应该在MS Access做什么:

TRANSFORM Count(Table1.Name) AS CountOfName 
SELECT Table1.City 
FROM Table1 
GROUP BY Table1.City 
PIVOT Table1.Type; 

我猜PLSQL是没有什么不同,但也有 “支点” 的条款可用

编辑

在PL/SQL通过使用枢轴

select * from (
    SELECT city, type FROM t) 
     PIVOT(count(*) for (type) in ('atm', 'branch')); 
+0

我觉得标签说''oracle' plsql'。 – Annjawn

+0

谢谢@Evert S,为了指向我的功能PIVOT –

+0

欢迎,(我不知道任何PL/SQL,所以请原谅我的问题),但为什么你需要列出你的列表中的各种类型? (atm,branch),是不是可以根据行值动态创建列的PIVOT的强度? –

1

若y您事先知道列中的所有值,然后您可以在查询中对它们进行硬编码。否则,它会变得更加复杂。这是Oracle SQL:

with my_data as 
    (select 'agra' city, 'atm' "type", 'X' "name" from dual union 
    select 'agra' city, 'branch' "type", 'X1' "name" from dual union 
    select 'delhi' city, 'atm' "type", 'X2' "name" from dual union 
    select 'agra' city, 'atm' "type", 'X3' "name" from dual union 
    select 'agra' city, 'atm' "type", 'X4' "name" from dual union 
    select 'delhi' city, 'branch' "type", 'X5' "name" from dual union 
    select 'chennai' city, 'branch' "type", 'X6' "name" from dual) 

select city, 
    sum(decode("type", 'atm', 1, 0)) as ATM, 
    sum(decode("type", 'branch', 1, 0)) as branch 
from my_data 
group by city; 

如果列数是未知的,Oracle有一个“PIVOT XML”声明,允许其返回所有的汇总数据保存在一个XML:

select * from my_data 
PIVOT XML (count("name") for "type" in (ANY)); 

您可以使用EXTRACTVALUE()函数自己分析每列,但这仍然意味着您知道提前多少列。我相信Oracle SQL无法创建具有动态列数的数据透视表。它可以在PL/SQL中完成,但你可以使用游标动态连接你的SQL。

+0

硬代码?如果有100个城市而不是3个城市呢? – Annjawn

+1

@安宁:WITH子句可能会误导人;它只是创建一个包含您显示的数据的临时表(使用通常的匿名表 - 它很奇怪多少次SQL问题忽略表名)。你不需要在真实的数据库中输入密钥;你只需从你的表中直接选择。你会在列1中编写以SELECT开始的SQL。 –