【oracle 비망록】 UNION ALL구에 키를 갖게 해, UNION ALL구를 재정렬
목적
화면 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문을 작성하고 싶다.
Reference
이 문제에 관하여(【oracle 비망록】 UNION ALL구에 키를 갖게 해, UNION ALL구를 재정렬), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/uncleJAM/items/7a7af0910ab683e4bdf2
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
-- ■各画面の未完了件数,名称取得
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
-- 画面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
Reference
이 문제에 관하여(【oracle 비망록】 UNION ALL구에 키를 갖게 해, UNION ALL구를 재정렬), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/uncleJAM/items/7a7af0910ab683e4bdf2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)