2016-10-18 2 views
0

テーブル内でグループ化した後にこのデータを保持しています。したがって、異なる名前が関連付けられているため、コードは を2回繰り返しています。長さに基づいてレコードを取得するには、Oracleグループby

しかし、最大の長さは

  • cs161のために、私は私がC_SCHLASINGER
が必要 Craig L Smith
  • cs226を必要とするので、それ以外の場合は、その名前を取得し、短い名前を取得、

    もっとしている時はいつでも私が欲しいです

    以下のデータを取得するために使用したクエリは

    です
    Select code, name, max(length(name)) 
    from acct 
    where code in ('CS226', 'CS161') 
    group by code,name 
    

    と結果である:

    CODE    MAX(LENGTH(T1.NAME))      NAME 
    CS161      7        C SMITH 
    CS226      13        C SCHLASINGER 
    CS161      13        CRAIG L SMITH 
    

    任意のヘルプ高く評価

  • 答えて

    0

    ...あなたが持っていること「コード」に関連付けられた複数の「名前」があり、最長のものを選択したいのですか?同じ長さ(同じコード)で結ばれた2つの名前がある場合はどうなりますか?いずれにしても、おそらくコードだけでグループ化することを意図していました(コードと名前ではなく、グループ化をまったく生成しません)。

    ここでは、同じ(最大)長さのすべての名前を選択する基本的な解決方法があります。それ以外の場合は、最も長い名前を持つものが1つしかない場合は、最も長いものを選択します。

    select code, name 
    from acct a 
    where length(name) = (select max(length(name)) from acct where code = a.code) 
    ; 
    

    あるいは、GROUP BYを使用して(代わりに相関サブクエリの)参加:ここ

    select a.code, a.name 
    from acct a inner join 
          (select code, max(length(name)) as max_len from acct group by code) b 
           on a.code = b.code and length(a.name) = b.max_len 
    ; 
    

    は、より高度な解決策です。与えられたコードでは最長の名前が選ばれ、2つが最長で結ばれている場合はアルファベット順の最初のコードが選択されます。したがって、すべての状況でコードごとに1つの名前しか返しません。 (両方のアプローチのための)

    select code, min(name) keep (dense_rank last order by length(name)) as name 
    from acct 
    group by code 
    ; 
    

    デモ:

    with 
        acct (code, name) as (
         select 'CS161', 'C SMITH'  from dual union all 
         select 'CS226', 'C SCHLASINGER' from dual union all 
         select 'CS161', 'CRAIG L SMITH' from dual union all 
         select 'CS180', 'V HEUSE'  from dual union all 
         select 'CS180', 'V HAUSE'  from dual 
        ) 
    select code, name 
    from acct a 
    where length(name) = (select max(length(name)) from acct where code = a.code) 
    ; 
    
    CODE NAME   
    ----- ------------- 
    CS226 C SCHLASINGER 
    CS161 CRAIG L SMITH 
    CS180 V HEUSE  
    CS180 V HAUSE 
    

    with 
        acct (code, name) as (
         select 'CS161', 'C SMITH'  from dual union all 
         select 'CS226', 'C SCHLASINGER' from dual union all 
         select 'CS161', 'CRAIG L SMITH' from dual union all 
         select 'CS180', 'V HEUSE'  from dual union all 
         select 'CS180', 'V HAUSE'  from dual 
        ) 
    select code, min(name) keep (dense_rank last order by length(name)) as name 
    from acct 
    group by code 
    ; 
    
    CODE NAME   
    ----- ------------- 
    CS161 CRAIG L SMITH 
    CS180 V HAUSE  
    CS226 C SCHLASINGER 
    
    0

    単純にクエリを変更します。要件は少し不明である

    select code, max(name) from acct 
    where 
    code in('CS226','CS161') 
    group by code 
    
    関連する問題