2016-07-21 9 views
0

列を別のテーブルに移動する準備として、ゾーンデータを取得するためのクエリを作成しようとしています。私たちのDBがどのように設定されているかは、資産とケーブルがあることです。 1つの資産には多数のケーブルを割り当てることができますが、ケーブルには複数の資産を設定することはできません。現在、ゾーンテーブルをケーブルテーブル(たとえば、以下)から資産テーブルに移動しようとしています。CASEステートメントの問題を使用して集計データを選択する

A_ID C_ID  Zone   
-------------------------- 
1  1   Green 
1  2   Green 
1  3   Yellow 
2  4   Green 
2  5   Red 
3  6   Yellow 
3  7   Yellow 
3  8   Yellow 
3  9   Red 

資産が異なるゾーンと複数のケーブルが含まれている場合、ゾーンの一つが黄色に黄色、それはデフォルト(例であれば、私はそれが資産テーブル用に設定したい方法が、ある。3本の、緑のケーブル、1黄色のケーブル - Asset_IDに黄色のゾーンがあります)。次にイエローがなくても赤が1つ以上ある場合は、デフォルトで赤になります(緑色のケーブル2本、赤色のケーブル3本 - Asset_IDに赤いゾーンがあります)。グリーンゾーンがある場合のみ、デフォルトでグリーンになります。

上記のサンプルテーブルを使用すると、私が期待する結果が得られます。

Expected Results  

A_ID Zone 
------------- 
1  Yellow 
2  Red 
3  Yellow 

私は、CASE文を使用しようとしているが、私は結果を正しくグループにクエリを策定する難しさを抱えています。

お手数をおかけしますようお願い申し上げます。よろしくお願いいたします。

+0

ウィンドウ機能を備えたCTEをお試しください。 RowNumのようなもの(ケースゾーンによる資産の順序によるパーティション、黄色のときは1、赤のときは2、緑のときは3)。そして外側のクエリでは、各グループから一番上の行を選択します。 –

答えて

0

必要な場合もあれば、必要な場合もありません。セットで考える。優先度に優先度結合を割り当て、優先度が最も高いものを最初に選択する必要があります。このように

WITH Priority AS 
(
    SELECT * FROM (
    VALUES 
    ('Yellow', 1), 
    ('Red', 2), 
    ('Green', 3) 
    ) AS P(Zone,P) 
) 
SELECT A_ID, Zone 
FROM (  
    SELECT A_ID, Zone 
     ROW_NUMBER() OVER (PARTITION BY A_ID ORDER BY P.P ASC) AS RN 
    FROM AssetTable A 
    LEFT JOIN Priority P ON A.Zone = P.Zone 
) SUB 
WHERE RN = 1 

OracleのCTEでVALUESに正しい構文が使用されているかどうかわかりません。条件付きの集約とcase式を使用してそれを行うには

WITH Priority AS 
(
    SELECT 'Yellow' AS Zone, 1 AS P 
    UNION ALL 
    SELECT 'Red' AS Zone, 2 AS P 
    UNION ALL 
    SELECT 'Green' AS Zone, 3 AS P 
) 
0

一つの方法:それはエラーを出します。このと交換してください。

単純なをしないのはなぜ
select a_id 
,case when yellow_count >=1 then 'Yellow' 
     when yellow_count = 0 and red_count >=1 then 'Red' 
     when yellow_count = 0 and red_count = 0 and green_count >=1 then 'Green' 
end zone 
from (select a_id, 
     count(case when zone = 'Yellow' then 1 end) yellow_count, 
     count(case when zone = 'Red' then 1 end) red_count 
     count(case when zone = 'Green' then 1 end) green_count 
     from cable_table 
     group by a_id) t 
+0

あなたはcountとcaseがjoinとrow_number()よりも遅いと思いませんか? – Hogan

0

SELECT A_ID, MAX(Zone) 
FROM table 
GROUP BY A_ID 

一部A_IDがYellowを持っている場合、いくつかのA_IDはYellowをしていないが、その後Red最大を持っているならば、最大(ゾーン)Yellow
を返します。 (ゾーン)は赤色を返します<br> otherwise (no黄色nor赤色) max(Zone) returns緑色

例:

with data as (
select 1 a_id, 1 c_id ,   'Green' zone from dual union all 
select 1 , 2 ,  'Green' from dual union all 
select 1 ,  3,   'Yellow' from dual union all 
select 2 ,  4 ,   'Green' from dual union all 
select 2 ,  5 ,   'Red' from dual union all 
select 3 ,  6 ,  'Yellow' from dual union all 
select 3 , 7 ,  'Yellow' from dual union all 
select 3 , 8  , 'Yellow' from dual union all 
select 3 , 9 ,  'Red' from dual 
) 
select a_id, max(zone) 
from data 
group by a_id 


     A_ID MAX(ZO 
---------- ------ 
     1 Yellow 
     2 Red 
     3 Yellow 
関連する問題