我有一个大型sql查询,它连接来自多个表的列,以提供这种格式的数据:
ID CODE Count Action
-----------------------------
1 A 02 VIEWED
1 A 22 CLICKED
1 A 45 PRINTED
1 A 32 SCHEDULED
2 A 34 VIEWED
2 B 14 CLICKED
2 B 23 PRINTED
2 B 78 SCHEDULED
.
.
X D 12 CLICKED操作的值只能查看、单击、排定、打印。每个ID、代码的组合都有最多4行。如果没有计算操作(例如“单击”),则不存在用于该操作的行。
因此,一旦我有了结果集,我想把它压平,使其具有这种格式的数据:
Id CODE VIEWED CLICKED PRINTED SCHEDULED
-----------------------------------------------
1 A 02 11 45 32
1 B 54 57 89 45
2 B 34 14 23 78
3 G null null 28 20
X D null 12 null null我的查询做了很多事情,但简而言之,它做到了:
SELECT ID,CODE, ACTION, COUNT(*) AS COUNT
FROM MY_TABLE
GROUP BY ID,CODE,ACTION. 在这个查询中,我希望得到结果集,然后将行平铺。我不能使用union-all等来多次查询DB。
数据库是Oracle 9i数据库,因此支点功能无法工作。
发布于 2013-12-10 02:58:01
应该能够将SUM与CASE一起使用,从GROUP BY子句中删除ACTION:
SELECT ID,
CODE,
SUM(CASE WHEN ACTION = 'VIEWED' THEN 1 ELSE 0 END) Viewed,
SUM(CASE WHEN ACTION = 'CLICKED' THEN 1 ELSE 0 END) Clicked,
SUM(CASE WHEN ACTION = 'PRINTED' THEN 1 ELSE 0 END) Printed,
SUM(CASE WHEN ACTION = 'SCHEDULED' THEN 1 ELSE 0 END) Scheduled
FROM MY_TABLE
GROUP BY ID,
CODE发布于 2013-12-10 12:41:12
select id,code,decode(action,'VIEWED',count,'null') viewed,
decode(action,'CLICKED',count,'null') Clicked,
decode(action,'PRINTED',count,'null') Printed,
decode(action,'SCHEDULED',count,'null') Scheduled from you_table groub by ID,CODE;https://stackoverflow.com/questions/20485051
复制相似问题