
同じ構成のテーブルがテーブル1~テーブル6まであり、6つのテーブルを集計するSQLを作成しています。
カラムは
ID、名前、日付1、日付2、ステータス1、ステータス2
です。
IDがプライマリーキーになっており、テーブル1にしかないIDや全てのテーブルに登録されているIDなどもあり、IDの一覧を作成したいです。
IDが重複していた場合、名前はどれを残しても構わないのですが(どのテーブルか指定する必要があるのならばとりあえずテーブル番号が若い方の名前を残すようにしてください。)
日付1は最古の日付
日付2は最新の日付
ステータスは共に優先順位が1>2>0>nullとなっており優先順位が高いほうを残すようにし、ステータスが両方nullの場合は集計しないようにしたいです。
テーブル1
ID、名前、日付1、日付2、ステータス1、ステータス2
111、あああ、2001/1/1、2001/1/1、2、2
222、いいい、2001/1/1、2001/1/1、2、2
333、ううう、2001/1/1、2001/1/1、null、null
555、おおお、2001/1/1、2001/1/1、2、2
テーブル2
ID、名前、日付1、日付2、ステータス1、ステータス2
111、aaa、2002/2/2、2002/2/2、0、null
222、iii、2002/2/2、2002/2/2、1、0
333、uuu、2002/2/2、2002/2/2、null、null
444、eee、2002/2/2、2002/2/2、1、1
結果
ID、名前、日付1、日付2、ステータス1、ステータス2
111、あああ、2001/1/1、2002/2/2、2、2
222、いいい、2001/1/1、2002/2/2、1、2
444、eee、2002/2/2、2002/2/2、1、1
555、おおお、2001/1/1、2001/1/1、2、2
このようなことを6つのテーブルを集計して行いたいです。
SELECT t1.id,MIN(t1.日付1)as 日付1,MAX(t1.日付2)as 日付2,CASE When t1.ステータス1="1" then "1" else t1.ステータス1 end ,CASE When t1.ステータス2="1" then "1" else t1.ステータス2 end
FROM(
SELECT *
FROM テーブル1
UNION All
SELECT *
FROM テーブル2
UNION All
SELECT *
FROM テーブル3
UNION All
SELECT *
FROM テーブル4
UNION All
SELECT *
FROM テーブル5
UNION All
SELECT *
FROM テーブル6
)as t1
WHERE NOT(t1.ステータス1 IS null AND t1.ステータス2 IS null)
GROUP BY id
日付は出来ていると思うのですが、ステータスで1の優先がまだ出来ていないので修正お願いいたします。
No.1ベストアンサー
- 回答日時:
ステータスを順位付けするテーブルを作るとよいかと
/* 初期値 - 検証のためテーブル1のデータを増やしてます */
create table テーブル1(ID int,名前 varchar(20),日付1 date,日付2 date,ステータス1 int null,ステータス2 int null);
create table テーブル2(ID int,名前 varchar(20),日付1 date,日付2 date,ステータス1 int null,ステータス2 int null);
create table テーブル3(ID int,名前 varchar(20),日付1 date,日付2 date,ステータス1 int null,ステータス2 int null);
insert into テーブル1 values(111,'あああ','2001/1/1','2001/1/1',2,2),(222,'いいい','2001/1/1','2001/1/1',2,2),(333,'ううう','2001/1/1','2001/1/1',null,null),(555,'おおお','2001/1/1','2001/1/1',2,2),(666,'かかか','2001/1/1','2001/1/1',null,0);
insert into テーブル2 values(111,'aaa','2002/2/2','2002/2/2',0,null),(222,'iii','2002/2/2','2002/2/2',1,0),(333,'uuu','2002/2/2','2002/2/2',null,null),(444,'eee','2002/2/2','2002/2/2',1,1);
insert into テーブル3 values(111,'あああ','2001/1/1','2002/2/2',2,2),(222,'いいい','2001/1/1','2002/2/2',1,2),(444,'eee','2002/2/2','2002/2/2',1,1),(555,'おおお','2001/1/1','2001/1/1',2,2);
/* ステータスの順位付けテーブルを作る */
create table ステータス(status int null,rank int);
insert into ステータス values(1,1),(2,2),(0,3)
/* 集計 */
select
ID,日付1,日付2,st3.status as ステータス1,st4.status as ステータス2
from(
select ID,MIN(日付1) AS 日付1,MAX(日付2) AS 日付2
,MIN(st1.rank) as r1
,MIN(st2.rank) as r2
from (
select * from テーブル1
union all select * from テーブル2
union all select * from テーブル3
) uni1
left join ステータス as st1 on uni1.ステータス1=st1.status
left join ステータス as st2 on uni1.ステータス2=st2.status
GROUP BY ID
having r1 is not null or r2 is not null
) uni2
left join ステータス as st3 on uni2.r1=st3.rank
left join ステータス as st4 on uni2.r2=st4.rank
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【SQL】他テーブルに含まれる値...
-
Accessの構成をコピーしたい
-
既存データをINSERT文にして出...
-
ADO+ODBCでテーブルに接続する...
-
DB2のSQLコマンドについて
-
ExcelのVLOOKUP関数の動作をMyS...
-
ExcelのMatch関数のようなもの...
-
あってますか?SQL
-
SQLです!!教えてください。あ...
-
H2 DataBaseご存知の方教えて...
-
SQLサーバに対するSQL文で抽出...
-
結合したテーブルをSUMしたい
-
複数のテーブルからデータを取...
-
SELECT INTOで一度に複数の変数...
-
sqlに記述できない文字
-
フラグをたてるってどういうこ...
-
PostgreSQLのtimestamp型で時間...
-
ACCESS テキストボックスに入...
-
Excel VBAのユーザーフォームで...
-
timestampのデータはどのように...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【SQL】他テーブルに含まれる値...
-
SQLサーバに対するSQL文で抽出...
-
既存データをINSERT文にして出...
-
SQLで、Join句で結合したテ...
-
Accessの構成をコピーしたい
-
結合したテーブルをSUMしたい
-
副問合せを使わずにUNIONと同様...
-
テーブル名が可変の場合のクエ...
-
2つのテーブルをLIKE演算子のよ...
-
ExcelのMatch関数のようなもの...
-
改行を含んだデータのインポート
-
PRIMARY KEYのコピー
-
ADO+ODBCでテーブルに接続する...
-
ACCESSのVBAにてExcelに行...
-
同一テーブル内での比較(最新...
-
(SQL)日数の計算
-
ExcelのVLOOKUP関数の動作をMyS...
-
データ無し時は空白行にしたい...
-
必要なテーブルの個数について。
-
複数選択か?単数選択か? テ...
おすすめ情報