Oracle Query Group By不能按我的意愿工作

时间:2014-05-10 03:58:10

标签: sql oracle

如何对此数据表进行分组:

username    module_id
testdavid   M0003
testdavid   M0001
testdavid   M0004
testdavid   M0002

username    module_id
testdavid   M0003
            M0001
            M0004
            M0002

我使用此查询但仍显示4行testdavid。 这是我的疑问:

SELECT USERNAME, MODULE_ID FROM SEIAPPS_T_ACCESS_MODULE WHERE USERNAME = 'testdavid' GROUP BY USERNAME, MODULE_ID;

请帮忙解决这个问题。感谢

2 个答案:

答案 0 :(得分:1)

通常,您希望在应用程序层中执行此类工作。结果集不符合与SQL表和结果集关联的“表”布局。

尽管如此,这是可能的:

SELECT (CASE WHEN ROW_NUMBER() OVER (PARTITION BY USERNAME ORDER BY MODULE_ID) = 1 THEN USERNAME
        END) as USERNAME, MODULE_ID
FROM SEIAPPS_T_ACCESS_MODUL
WHERE USERNAME = 'testdavid'
GROUP BY USERNAME, MODULE_ID
ORDER BY USERNAME, MODULE_ID;

实际上,如果您只想获得与用户名相关联的模块列表,为什么不将它们全部放在一行上呢?

select username, listagg(module_id, ',') within group (order by module_id)
from (select username, module_id
      from SEIAPPS_T_ACCESS_MODUL
      where username = 'testdavid'
      group by username, module_id
     ) um
group by username;

答案 1 :(得分:1)

我必须同意这应该在您的演示逻辑中处理。但是,这是一种使用LAG()的方法:

select 
  case 
    when lag(username,1) over (order by username) is null then username 
  end username, 
  module_id
from yourtable
where username = 'testdavid'