2017-07-21 14 views
1

コンテナグループに結果がある多数のグループにテストがあるかどうかを判断する必要があります。結果を含むグループ内でのテストの検索 - Oracle 12

私は単純なループが必要だと思っていますが、私の心の中でそれをフレーム化することはできません。コンテナからテストまでのすべてのドットを結び付けた4つのテーブルのグループがあり、結果が得られます。

con_group1は、container_groupsを含んでいます。表containers2は、container_group_idsおよび個別container_idsおよびtest_group idsを含んでいます。表test_groups3テーブルtests4はと result_idにtest_idsが含まれ、test_group_idstest_idsが含まれています。 Table 5に結果が含まれています。

どのコンテナにすべての結果があるテストがあるかを判断する必要があります。コンテナに含まれるすべてのテストの結果があるかどうかだけで、結果が何であるかは関係ありません。

------------------------------------ 
| Container | Test | Result | 
------------------------------------ 
| 8  | 69 |   | 
| 9  | 87 | 8 | 
| 8  | 45 |   | 
| 6  | 58 |   | 
| 9  | 95 | 5 | 
------------------------------------ 

望ましい結果:

------------------------- 
| Container Group |   | 
------------------------- 
|  2  | done | 
|  1  | open | 
|  3  | open | 
------------------------- 

{CREATE TABLE CONTAINERS2 
(CON_GROUP NUMBER(10), 
CONTAINER NUMBER(10)); 

CREATE TABLE CON_GROUP1 
(CON_GROUP NUMBER(10)); 
CREATE TABLE TESTS4 
(RESULT_ID NUMBER(10), 
    TEST  NUMBER(10)); 

CREATE TABLE TEST_GROUPS3 
(CONTAINER NUMBER(10), 
TEST  NUMBER(10)); 

INSERT INTO CONTAINERS2(CON_GROUP, CONTAINER) VALUES (1, 8); 
INSERT INTO CONTAINERS2(CON_GROUP, CONTAINER) VALUES (3, 6); 
INSERT INTO CONTAINERS2(CON_GROUP, CONTAINER) VALUES (2, 9); 
INSERT INTO CON_GROUP1(CON_GROUP) VALUES(1); 
INSERT INTO CON_GROUP1(CON_GROUP) VALUES(2); 
INSERT INTO CON_GROUP1(CON_GROUP) VALUES(3); 

INSERT INTO TESTS4(RESULT_ID, TEST) VALUES (8, 87); 
INSERT INTO TESTS4 (RESULT_ID, TEST) VALUES (NULL, 45); 
INSERT INTO TESTS4 (RESULT_ID, TEST) VALUES(NULL, 58); 
INSERT INTO TESTS4 (RESULT_ID, TEST) VALUES (NULL, 69); 
INSERT INTO TESTS4 (RESULT_ID, TEST) VALUES(5, 95); 

INSERT INTO TEST_GROUPS3(CONTAINER, TEST) VALUES(8, 45); 
INSERT INTO TEST_GROUPS3 (CONTAINER, TEST) VALUES(9, 87); 
INSERT INTO TEST_GROUPS3 (CONTAINER, TEST) VALUES(6, 58); 
INSERT INTO TEST_GROUPS3(CONTAINER, TEST) VALUES (8, 69); 
INSERT INTO TEST_GROUPS3(CONTAINER, TEST) VALUES (9, 95);} 

答えて

1

LEFTのシリーズをJOINとGROUP BY仕事をすることができます。

SELECT cg.con_group, 
     max(CASE WHEN result_id IS NULL 
       THEN 'Open' ELSE 'Closed' 
      END) As Result 
FROM con_group1 cg 
LEFT JOIN CONTAINERS2 co ON co.con_group = cg.con_group 
LEFT JOIN TEST_GROUPS3 tg ON tg.container = co.container 
LEFT JOIN TESTS4 t4 ON t4.TEST = tg.TEST 
GROUP BY cg.con_group 

デモ:SQLFiddle

| con_group | result | 
|-----------|--------| 
|   1 | Open | 
|   3 | Open | 
|   2 | Closed | 

...私はよくこの要件を理解していれば、あなたが必要

... コンテナは、コンテナのグループに 資格を取得するために修飾する必要があります。..コンテナ、グループが資格をどのコンテナを決定する必要はありません。

SELECT cg.con_group, 
     co.CONTAINER, 
     max(CASE WHEN result_id IS NULL 
       THEN 'Open' ELSE 'Closed' 
      END) As Result 
FROM con_group1 cg 
LEFT JOIN CONTAINERS2 co ON co.con_group = cg.con_group 
LEFT JOIN TEST_GROUPS3 tg ON tg.container = co.container 
LEFT JOIN TESTS4 t4 ON t4.TEST = tg.TEST 
GROUP BY cg.con_group, 
     co.CONTAINER 

デモ:SQLFiddle

| con_group | container | result | 
|-----------|-----------|--------| 
|   1 |   8 | Open | 
|   2 |   9 | Closed | 
|   3 |   6 | Open | 
0

あなたは、コンテナごとのテストの数とコンテナあたりの結果とテストの数をカウントし、2つの結果セットを比較する必要があります。このソリューションは、2つのカウントを取得するためにサブクエリを使用し、(テストの多分グループは全く結果を持っていないので)外部結合:

with tests as 
    (select tg.container 
      , count(tg.test) as tst_cnt 
     from test_groups3 tg 
     group by tg.container) 
    , results as 
    (select tg.container 
      , count(tr.test) as tst_cnt 
     from test_groups3 tg 
      join tests4 tr 
       on tr.test = tg.test 
     group by tg.container) 
select tests,container 
     , case when tests.tst_cnt = results.tst_cnt 
      then 'done' 
     else 'open' 
     end as status 
from tests 
    left join results 
    on tests.constainer = results.container 
/
+0

距離から素晴らしいです。私は自分のデータ/テーブル構造に適用し、それが私に必要なものを与えてくれるかどうかを確認します...ありがとうございます! – user761758

+0

あなたのコードは、私が問題を誤解したという事実を明らかにしました...私はコンテナではなく、どのコンテナグループが適格であるかを判断する必要があります。コンテナは、コンテナグループの資格を取得する資格がなければなりません。 – user761758

関連する問題