※この備忘録は初学者の私が学習、もしくは業務で体験した内容を忘れないために書き起こしたものとなります。
目的
画面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文を作成したい。