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: SELECT で使用したようにすべての列を使用していないため、式によるグループではありませんが、その後、必要な結果が得られません。

どのように進めればよいでしょうか?

4

6 に答える 6

4

ジャアンナ、

サンプルデータセットには5行があり、期待される出力には9行が含まれています。これらの余分な4行は、name_fullとidがロールアップされている(company、division、business_area、unit)ごとの集計です。

サンプルデータ:

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

あなたがやろうとしていることは、「groupby」クエリを使用して達成することはできません。むしろ、次のように「順序付け」を使用できます。

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

それが役に立てば幸い

編集:フローリンの答えにコメントできなくてすみません。Florinの答えも素晴らしいですが、たとえばWebUIでさらに処理するのは難しいでしょう。それがplsqlであり、出力が質問で記述したものとまったく同じである必要がある場合は、ループを使用して、各Company、Division、BusinessArea、Unitグループの名前とIDを取得する必要があります。

于 2012-08-22T12:08:00.457 に答える
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

私はこの環境に詳しくありませんが、通常、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 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  |

次に、UI で結果をループして、ヘッダーとして 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 に答える