【intra-mart】【SQL】組織と組織階層情報の取得 | 株式会社アースリンク

Engineer Blog開発者ブログ

2021.5.7

【intra-mart】【SQL】組織と組織階層情報の取得

こんばんは!!

今回ご紹介するのは、intra-mart既存のテーブルより”組織と組織階層”を取得する方法になります。

主要となるのは以下のテーブルになります。

・IMM_DEPARTMENT  (組織マスタ)
 ⇒組織の基本情報を保持するテーブル

・IMM_DEPARTMENT_INC_ATH (会社組織内包)
 ⇒組織とその上位組織を紐づけるためのテーブル
  このテーブルでは対象組織とその上位組織までの分、レコード情報を持ちます

例)「組織A11」という組織の階層が『組織A/ 組織A1/ 組織A11』の場合、以下のような形式でデータを持っている。

■実行SQL
・以下の例では、”2021/04/01″に有効なユーザ別役職情報を取得しています。

SELECT
  COMPANY_CD           -- 会社コード
  , DEPARTMENT_SET_CD  -- 組織セットコード
  , DEPARTMENT_CD      -- 組織コード
  , DEPT_NAME          -- 組織名
  , START_DATE         -- 所属期間開始日
  , END_DATE           -- 所属期間終了日
  ,  MAX( CASE WHEN depth='5' THEN PARENT_DEPARTMENT_CD || '/ '  ELSE '' END )
  || MAX( CASE WHEN depth='4' THEN PARENT_DEPARTMENT_CD || '/ '  ELSE '' END )
  || MAX( CASE WHEN depth='3' THEN PARENT_DEPARTMENT_CD || '/ '  ELSE '' END )
  || MAX( CASE WHEN depth='2' THEN PARENT_DEPARTMENT_CD || '/ '  ELSE '' END )
  || MAX( CASE WHEN depth='1' THEN PARENT_DEPARTMENT_CD || '/ '  ELSE '' END )
  || MAX( CASE WHEN depth='0' THEN PARENT_DEPARTMENT_CD ELSE '' END ) AS DEPT_INC -- 組織階層(コード)
  ,  MAX( CASE WHEN depth='5' THEN P_DEPT_NAME || '/ '  ELSE '' END )
  || MAX( CASE WHEN depth='4' THEN P_DEPT_NAME || '/ '  ELSE '' END )
  || MAX( CASE WHEN depth='3' THEN P_DEPT_NAME || '/ '  ELSE '' END )
  || MAX( CASE WHEN depth='2' THEN P_DEPT_NAME || '/ '  ELSE '' END )
  || MAX( CASE WHEN depth='1' THEN P_DEPT_NAME || '/ '  ELSE '' END )
  || MAX( CASE WHEN depth='0' THEN P_DEPT_NAME ELSE '' END ) AS DEPT_NAME_INC -- 組織階層(名称)
FROM 
  (
    SELECT
      A.COMPANY_CD
      , A.DEPARTMENT_SET_CD
      , A.DEPARTMENT_CD
      , A.DEPTH
      , A.PARENT_DEPARTMENT_CD
      , B.DEPARTMENT_NAME AS P_DEPT_NAME
      , C.DEPARTMENT_NAME AS DEPT_NAME
      , C.START_DATE
      , C.END_DATE
    FROM
      IMM_DEPARTMENT_INC_ATH A
      INNER JOIN IMM_DEPARTMENT B    -- 親組織名の取得
      ON  A.COMPANY_CD = B.COMPANY_CD
      AND A.DEPARTMENT_SET_CD = B.DEPARTMENT_SET_CD
      AND A.PARENT_DEPARTMENT_CD = B.DEPARTMENT_CD
      AND B.LOCALE_ID = 'ja'
      AND B.DELETE_FLAG = '0'
      AND '20210401' BETWEEN TO_CHAR(B.START_DATE, 'YYYYMMDD') AND TO_CHAR(B.END_DATE, 'YYYYMMDD') 
      INNER JOIN IMM_DEPARTMENT C    -- 子組織名の取得
      ON  A.COMPANY_CD = C.COMPANY_CD
      AND A.DEPARTMENT_SET_CD = C.DEPARTMENT_SET_CD
      AND A.DEPARTMENT_CD = C.DEPARTMENT_CD
      AND C.LOCALE_ID = 'ja'
      AND C.DELETE_FLAG = '0'
      AND '20210401' BETWEEN TO_CHAR(C.START_DATE, 'YYYYMMDD') AND TO_CHAR(C.END_DATE, 'YYYYMMDD') 
  ) AS DEPT
GROUP BY 
  COMPANY_CD
  , DEPARTMENT_SET_CD
  , DEPARTMENT_CD
  , DEPT_NAME
  , START_DATE
  , END_DATE

ORDER BY 
   COMPANY_CD
  , DEPARTMENT_CD

 他で紹介しているユーザ情報の取得やユーザ所属組織のSQLと合わせて使ってみてください。

 それではまた次回。。。(^^)/~~

Contact
お問い合わせ

電話番号0120 - 889 - 236

受付時間:平日 9:00-18:00