2012-08-22 78 views
1

我现在面临一个问题,GROUP BY子句中,数据没有显示出来,因为我想有不工作:集团通过按预期

我的数据是这样的:

------------------------------------------------------------------- 
| Company | Division | Business Area | Unit | Name Full | ID | 
------------------------------------------------------------------- 
| Company 1 | Div 1 | Business 1 | Unit 1 | Customer 1 | 01 | 
| Company 1 | Div 1 | Business 1 | Unit 1 | Customer 2 | 02 | 
| Company 1 | Div 1 | Business 1 | Unit 2 | Customer 3 | 03 | 
| Company 1 | Div 1 | Business 3 | Unit 3 | Customer 2 | 02 | 
| Company 1 | Div 2 | Business 1 | Unit 1 | Customer 4 | 04 | 
.... 
.... 

在UI,我想有它显示的是这样的:

Company 1, Div 1, Business 1, Unit 1 
    -- Customer 1 01 
    -- Customer 2 02 
Company 1, Div 1, Business 1, Unit 2 
    -- Customer 3 03 
Company 1, Div 1, Business 3, Unit 3 
    -- Customer 2 02 
Company 1, Div 2, Business 1, Unit 1 
    -- Customer 4 04 

我尝试了查询,如果我尝试组只使用公司,DIV,企业和单位,然后我得到的错误:00979:不是像我一样通过表达来表达群体不像SELECT中使用的那样使用所有列,但是我没有得到我所需的结果。

任何想法我可以如何继续?

+0

这是不能直接解决使用只是一群,请做一些更多的研究,如何在SQL中'group by'子句工作。正确的做法还包括在读取数据的服务器环境中进行编码,或者在前端使用JavaScript。 – Reimius

回答

4

Jaanna,

你的榜样数据集有5行和您的预计输出包含9行。这些额外的4行是每个(公司,部门,business_area,单位)聚合,其中name_full和id正在汇总。

您的数据。例如:

SQL> create table mytable (company,division,business_area,unit,name_full,id) 
    2 as 
    3 select 'Company 1', 'Div 1', 'Business 1', 'Unit 1', 'Customer 1', '01' from dual union all 
    4 select 'Company 1', 'Div 1', 'Business 1', 'Unit 1', 'Customer 2', '02' from dual union all 
    5 select 'Company 1', 'Div 1', 'Business 1', 'Unit 2', 'Customer 3', '03' from dual union all 
    6 select 'Company 1', 'Div 1', 'Business 3', 'Unit 3', 'Customer 2', '02' from dual union all 
    7 select 'Company 1', 'Div 2', 'Business 1', 'Unit 1', 'Customer 4', '04' from dual 
    8/

Table created. 

查询:

SQL> select company 
    2  , division 
    3  , business_area 
    4  , unit 
    5  , name_full 
    6  , id 
    7 from mytable 
    8 group by company 
    9  , division 
10  , business_area 
11  , unit 
12  , rollup((name_full,id)) 
13 order by company 
14  , division 
15  , business_area 
16  , unit 
17  , grouping(name_full) desc 
18  , name_full 
19/

COMPANY DIVISION BUSINESS_AREA UNIT NAME_FULL ID 
--------- -------- ------------- ------ ---------- -- 
Company 1 Div 1 Business 1 Unit 1 
Company 1 Div 1 Business 1 Unit 1 Customer 1 01 
Company 1 Div 1 Business 1 Unit 1 Customer 2 02 
Company 1 Div 1 Business 1 Unit 2 
Company 1 Div 1 Business 1 Unit 2 Customer 3 03 
Company 1 Div 1 Business 3 Unit 3 
Company 1 Div 1 Business 3 Unit 3 Customer 2 02 
Company 1 Div 2 Business 1 Unit 1 
Company 1 Div 2 Business 1 Unit 1 Customer 4 04 

9 rows selected. 

您可能希望有条件地显示一些列的值或没有,但我将它作为一个练习给你。

Regards,
Rob。

1

我对环境并不熟悉,但通常GROUP BY查询要求每列都是GROUP BY字段或聚合字段。

你想达到什么看起来更像是一个ORDER BY给我。

希望这会有所帮助。

2

使用“group by”查询无法实现您尝试执行的操作。相反,你可以“按订单”像使用:

select * from table order by Company, Division, BusinessArea, Unit asc 

希望它有助于

编辑: 抱歉,我不能让上弗洛林的回答评论。例如,弗洛林的答案也很棒,但在Web UI上进一步处理会更困难。如果它是plsql,并且输出应该与您在问题中所写的内容完全相同,则应该使用循环来获取每个公司,部门,BusinessArea,单位组的名称和ID。

1
select 
    company, 
    division, 
    businessarea, 
    unit, 
    LISTAGG(fullname||' '||id , '|') WITHIN GROUP (ORDER BY fullname) 
from your_table 
group by company, division, businessarea, unit 
order by company, division, businessarea, unit 
+0

感谢弗洛林的回应。我尝试了你的解决方案,出于某种原因,我得到了“ORA-01489:字符串认知的结果太长了”。这是非常罕见的,因为没有一个全名超过4000个字符 – Jaanna

+0

,这是因为有些单位包含太多客户,所以(连接的)字符串变得很大。 –

1
select * from 

(
select Company, Division, BusinessArea, Unit ,NameFull,ID 
     from t 
union all 
select distinct Company, Division, BusinessArea, Unit ,'' as NameFull,0 as ID 
     from t 
) d 

order by Company, Division, BusinessArea, Unit ,NameFull,ID 
+0

产生与我的查询大致相同的数据集,但是有两个全表扫描。 –

1

如果您为公司/部门/业务区域/单位中的每个成员添加一个计数,例如,:

SELECT company, 
    division, 
    business_area, 
    unit, 
    name_full, 
    ID, 
    ROW_NUMBER() OVER (PARTITION BY company, division, business_area, unit 
    ORDER BY company, division, business_area, unit, name_full) AS rn 
FROM t1 

,应返回:

------------------------------------------------------------------------ 
| Company | Division | Business Area | Unit | Name Full | ID | rn | 
------------------------------------------------------------------------ 
| Company 1 | Div 1 | Business 1 | Unit 1 | Customer 1 | 01 |1 | 
| Company 1 | Div 1 | Business 1 | Unit 1 | Customer 2 | 02 |2 | 
| Company 1 | Div 1 | Business 1 | Unit 2 | Customer 3 | 03 |1 | 
| Company 1 | Div 1 | Business 3 | Unit 3 | Customer 2 | 02 |1 | 
| Company 1 | Div 2 | Business 1 | Unit 1 | Customer 4 | 04 |1 | 
在你的用户界面,你可以

然后通过成果循环,并显示每件有RN = 1为标题记录,然后全名& ID,这里的一些psudo代码

for each record loop 
if rn=1 
    display t1.division, t1.business_area 
end if 
display t1.name_full,id 
end loop