【oracle 비망록】 UNION ALL구에 키를 갖게 해, UNION ALL구를 재정렬

9298 단어 오라클SQL
※이 비망록은 초학자의 내가 학습, 혹은 업무로 체험한 내용을 잊지 않기 위해서 기인한 것이 됩니다.

목적



화면 1, 화면 2, 화면 3 내의 미완료 품목의 건수를 화면 4를 보고 파악할 수 있도록 하기 위해,
「화면 명칭」 「미완료 건수」를 정리해 추출하기 위한 SQL문을 작성하고 싶다.
※각 화면의 표시 내용에 대해서는, 각 화면 아래에 데이터 참조원을 기재


※모두 GAMEN1 테이블에서 참조
・[물건 No.]…GAMEN1.BUKKEN_NO
·[안건명]…GAMEN1.ANKEN_NAME
・[예산]…GAMEN1.YOSAN
・[완료]…GAMEN1.KANRYO ※미완료의 경우…"0", 완료의 경우…"1"

※모두 GAMEN2 테이블에서 참조
・[물건 No.]…GAMEN2.BUKKEN_NO
·[안건명]…GAMEN2.ANKEN_NAME
・[경비예산]…GAMEN2.KEIHI_YOSAN
・[완료]…GAMEN2.KANRYO ※미완료의 경우…"0", 완료의 경우…"1"

※모두 GAMEN3 테이블에서 참조
・[물건 No.]…GAMEN3.BUKKEN_NO
·[안건명]…GAMEN3.ANKEN_NAME
·[운송비 예산]…GAMEN3.YUSOUHI_YOSAN
・[완료]…GAMEN3.KANRYO ※미완료의 경우…"0", 완료의 경우…"1"


오답



아래 소스에서 추출한 데이터를 그대로 C#을 사용하여 (예 : foreach 등으로) 화면에 표시시킨 경우, 화면 4에 표시되는 화면 명칭의 순서가 위에서부터
「물건 제작 원가 견적 화면」⇒「경비 견적 화면」⇒「운송비 견적 화면」
의 순서가 되지 않는 경우가 있었다. (내 환경에서는 올바른 순서로 표시되었지만 다른 환경에서는 잘못된 순서로 표시되었습니다)
-- ■各画面の未完了件数,名称取得

WITH

-- 画面1(物件製作原価見積画面)の未完了件数
GAMEN1_MIKAN AS
(SELECT COUNT(KANRYO) AS MIKANRYO
  FROM GAMEN1
 WHERE GAMEN1.KANRYO = '0'),

-- 画面2(経費見積画面)の未完了件数
GAMEN2_MIKAN AS
(SELECT COUNT(KANRYO) AS MIKANRYO
   FROM GAMEN2
  WHERE GAMEN2.KANRYO = '0'),

-- 画面3(輸送費見積画面)の未完了件数
GAMEN3_MIKAN AS
(SELECT COUNT(KANRYO) AS MIKANRYO
   FROM GAMEN3
  WHERE GAMEN3.KANRYO = '0')

SELECT '物件製作原価見積画面'  AS GAMEN_NAME    --画面名称
      ,MIKANRYO              AS MIKANRYO_NUM  --未完了件数
  FROM GAMEN1_MIKAN

UNION ALL

SELECT '経費見積画面'
      ,MIKANRYO
  FROM GAMEN2_MIKAN

UNION ALL

SELECT '輸送費見積画面'
      ,MIKANRYO
  FROM GAMEN3_MIKAN

원인



위 코드에서 WITH 절 이후의 SELECT 문에서 ORDER BY로 표시 순서를 지정하지 않았기 때문입니다.

올바르게 표시되는 코드


-- ■各画面の未完了件数,名称取得

WITH

-- 画面1(物件製作原価見積画面)の未完了件数
GAMEN1_MIKAN AS
(SELECT COUNT(KANRYO) AS MIKANRYO
  FROM GAMEN1
 WHERE GAMEN1.KANRYO = '0'),

-- 画面2(経費見積画面)の未完了件数
GAMEN2_MIKAN AS
(SELECT COUNT(KANRYO) AS MIKANRYO
   FROM GAMEN2
  WHERE GAMEN2.KANRYO = '0'),

-- 画面3(輸送費見積画面)の未完了件数
GAMEN3_MIKAN AS
(SELECT COUNT(KANRYO) AS MIKANRYO
   FROM GAMEN3
  WHERE GAMEN3.KANRYO = '0')

SELECT '物件製作原価見積画面'  AS GAMEN_NAME    --画面名称
      ,MIKANRYO              AS MIKANRYO_NUM  --未完了件数
      ,1                     AS KEY           --表示順を決める為のキーナンバー
  FROM GAMEN1_MIKAN

UNION ALL

SELECT '経費見積画面'
      ,MIKANRYO
      ,2                     AS KEY
  FROM GAMEN2_MIKAN

UNION ALL

SELECT '輸送費見積画面'
      ,MIKANRYO
      ,3                     AS KEY
  FROM GAMEN3_MIKAN

 OREDR BY KEY

감상



이번 자신의 환경에서는 ORDER BY를 사용하지 않아도 우연히 올바른 표시 순서로 출력할 수 있었기 때문에 문제 없었지만 UNION ALL구는 반드시 위의 구부터 순서대로 표시되는 것은 아님을 알았다.
표시 순서를 지정하고 싶은 경우는, 반드시 ORDER BY를 이용해, 누구의 환경에서 구현했을 경우에서도 올바른 표시 순서로 출력되도록 SQL문을 작성하고 싶다.

좋은 웹페이지 즐겨찾기