有一张表table1 结构如下.

table1:

username    action  
--------------------------------
A                   CALL      
A                   SEARCH
A                   SEARCH
B                   CALL     
B                   SEARCH
A                   SEARCH
A                   VIDEO
B                   SEARCH
B                   VIDEO
A                   CALL 
B                   VIDEO
--------------------------------

通过一条SQL语句得出下列统计数据:

table2

username   CALL_TIMES       SEARCH_TIMES      VIDEO_TIMES
-------------------------------------------------------------------------------
A                     2                        3                              1
B                     1                        2                              2
-------------------------------------------------------------------------------

说明:

table.action 中所有可能的值都已知的,只有 CALL , SEARCH ,VIDEO 和 table2 的字段一一对应

table1 中目前数据50W条。

有没有效率较高的SQL语句?

 

评论
Lucas Lee 2008-04-11
不错,我也学了一招。
ealpha 2008-04-10

我自己做完成了

 

MYSQL 语句: 


select 
t.username,
max(CASE T.action WHEN 'CALL' THEN T.NN ELSE 0 end) as CALL_TIMES,
max(CASE T.action WHEN 'SEARCH' THEN T.NN ELSE 0 end) as SEARCH_TIMES,
max(CASE T.action WHEN 'VIDEO' THEN T.NN ELSE 0 end) as VIDEO_TIMES

from 
(select temp.username,temp.action,count(*) as NN 
 from temp
 group by temp.username,temp.action) as T

group by T.username




 对应的 Oracle 语句:

 

select username,

max(decode(action,'CALL',NN,0)) AS CALL_TIMES ,
max(decode(action,'VIDEO',NN,0)) AS VIDEO_TIMES ,
max(decode(action,'SEARCH',NN,0)) AS VIDEO_TIMES
from
(select username,action,count(*) AS NN from table1
group by username,action)

group by username

 

Lucas Lee 2008-04-10
这明显是一个交叉报表,就是说行头和列头都是动态从结果集里取得的。
应该先用一个简单的group by获得结果,再用报表工具,或者自己编程转换成最终结果。
语句为:select username,action,count(*) from table1 group by username,action
结果集为,例如:
username action count(*)
A CALL 2
A SEARCH 4
B CALL 3
B SEARCH 5
发表评论

提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则

您还没有登录,请登录后发表评论

ealpha
搜索本博客
存档
最新评论