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

我尝试了查询,如果我尝试仅使用 company、div、business 和 unit 进行分组,则会收到错误:00979:not a group by expression 因为我没有使用 SELECT 中使用的所有列,但后来我没有得到我要求的结果。

知道我该如何进行吗?

4

6 回答 6

4

贾安娜,

您的示例数据集有 5 行,您的预期输出包含 9 行。这些额外的 4 行是每个 (company,division,business_area,unit) 的聚合,其中 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.

您可能希望有条件地显示某些列值或不显示,但我将其作为练习留给您。

问候,
罗布。

于 2012-08-22T13:39:14.787 回答
2

使用“分组依据”查询无法实现您想要做的事情。相反,您可以使用“order by”,例如:

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

希望能帮助到你

编辑:对不起,我无法对弗洛林的回答发表评论。Florin 的回答也很棒,但例如在 Web UI 上进一步处理它会更困难。如果它是 plsql 并且输出应该与您在问题中所写的完全一致,您应该使用循环来获取每个 Company、Division、BusinessArea、Unit 组的名称和 ID。

于 2012-08-22T12:08:00.457 回答
1

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

你想要达到的目标对我来说更像是一个 ORDER BY。

希望这可以帮助。

于 2012-08-22T12:04:04.153 回答
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
于 2012-08-22T12:13:15.767 回答
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
于 2012-08-22T13:43:25.597 回答
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,这是一些伪代码

for each record loop
 if rn=1 
   display t1.division, t1.business_area
 end if
 display t1.name_full,id
end loop
于 2012-08-23T13:57:44.370 回答