0

3 つのコードを 1 つの匿名ブロックにまとめるのに助けが必要です。また、ユーザーが使用する置換値を入れる必要があります。どうすればそれを行うことができますか?? 私はOracle 10g Expressを使用しています。ここに私のコードがあります:

コード 1: 「Americas」にあるすべての部門について、部門名と部門ごとの従業員数を表示します。

select department_name, count(employee_id) "number of employees"
from employees, departments, locations, countries, regions
where employees.DEPARTMENT_ID = departments.DEPARTMENT_ID 
AND departments.location_ID = locations.location_ID 
AND locations.country_ID = countries.country_ID 
AND countries.region_ID = regions.region_ID 
AND regions.region_name = 'Americas'
group by department_name

コード 2: ポジションごとの平均給与は?

SELECT job_ID, AVG(salary) as "avg salary"
FROM employees
GROUP BY job_ID

コード 3:部門ごとの平均給与は?

SELECT department_ID, AVG(salary) as "avg salary"
FROM employees
GROUP BY department_ID
4

2 に答える 2

1

Oracle では、完全に異なるデータセットを 1 つのブロックに結合することはできません。匿名ブロックは、一連の PL/SQL コマンドを実行するためのものです。クエリ (例: 結果セットを返すものSELECT ...) は 1 つの結果しか返すことができないため、3 つの個別のクエリが必要になります。

これらすべてを使用している場合はSQL*Plus、コマンド ラインおよび/または.sqlスクリプト ファイルを使用して実行できます。コマンドラインでパラメーターを指定することもできます (最初のクエリでそれが意味するものかどうかはわかりませんでしたが、とにかく追加しました)。

スクリプト ( foo.sql):

-- Set page size to something larger than the expected result set.
-- NOTE: You don't want to put 0 (unlimited) as it supresses the column headers.
SET pagesize 50000

-- Get the parameter from the command line:
VAR region VARCHAR2(256)
EXEC :region := '&1'

SELECT 'Processing for region: ' || :region
FROM dual;

-- Query 1
promp "Employee detail in specified region:"
select department_name, count(employee_id) "number of employees"
from HR.employees, HR.departments, HR.locations, HR.countries, HR.regions
where employees.DEPARTMENT_ID = departments.DEPARTMENT_ID
AND departments.location_ID = locations.location_ID
AND locations.country_ID = countries.country_ID
AND countries.region_ID = regions.region_ID
AND regions.region_name = :region
group by department_name
;


-- Query 2:
promp "Average salary by position:"
SELECT job_ID, AVG(salary) as "avg salary"
FROM HR.employees
GROUP BY job_ID;


-- Query 3:
promp "Average salaries by department:"
SELECT department_ID, AVG(salary) as "avg salary"
FROM HR.employees
GROUP BY department_ID;

exit

出力:

$ sqlplus myuser/mypass@lvm01xe @sample.sql Americas

SQL*Plus: Release 11.2.0.2.0 Production on Sun Nov 18 09:11:11 2012

Copyright (c) 1982, 2010, Oracle.  All rights reserved.


Connected to:
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production


PL/SQL procedure successfully completed.


'PROCESSINGFORREGION:'||:REGION
--------------------------------------------------------------------------------
Processing for region: Americas

"Employee detail in specified region:"

DEPARTMENT_NAME                number of employees
------------------------------ -------------------
Administration                                   1
Accounting                                       2
IT                                               5
Purchasing                                       6
Executive                                        3
Shipping                                        45
Finance                                          6
Marketing                                        2

8 rows selected.

"Average salary by position:"

JOB_ID     avg salary
---------- ----------
IT_PROG          5760
AC_MGR          12000
AC_ACCOUNT       8300
ST_MAN           7280
PU_MAN          11000
AD_ASST          4400
AD_VP           17000
SH_CLERK         3215
FI_ACCOUNT       7920
FI_MGR          12000
PU_CLERK         2780
SA_MAN          12200
MK_MAN          13000
PR_REP          10000
AD_PRES         24000
SA_REP           8350
MK_REP           6000
ST_CLERK         2785
HR_REP           6500

19 rows selected.

"Average salaries by department:"

DEPARTMENT_ID avg salary
------------- ----------
          100       8600
           30       4150
                    7000
           90 19333.3333
           20       9500
           70      10000
          110      10150
           50 3475.55556
           80 8955.88235
           40       6500
           60       5760
           10       4400

12 rows selected.

Disconnected from Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
于 2012-11-18T14:16:11.137 に答える
0

もちろん、同じ尺度で集計されたものは簡単に組み合わせることができます。したがって、次のように 3 番目のクエリを最初のクエリとマージできます。

select department_name
       , count(employee_id) as "number of employees"
       , avg(salary) as "avg salary"
from employees, departments, locations, countries, regions
where employees.DEPARTMENT_ID = departments.DEPARTMENT_ID 
AND departments.location_ID = locations.location_ID 
AND locations.country_ID = countries.country_ID 
AND countries.region_ID = regions.region_ID 
AND regions.region_name = :region_name
group by department_name

バインド変数を渡すようにコードを調整しました:region_name。Apex で変数を指定するには、さまざまな方法があります。 詳細をご覧ください

2 番目のクエリを含める意味のある方法はありません。JOB_ID の値は DEPARTMENT_ID の値と交差するため、結合するための共通キーはありません。

于 2012-11-18T22:12:41.017 に答える