0

以下のクエリでは、タイプ値が「ABC」および「XYZ」であるレコードをフィルタリングしようとしています。

各ca_idには、最大3つのタイプを含めることができます(ABC、XYZ、および'')

また、ユニオンを使用している空のタイプを1つ取得する必要があります。

問題は、ユニオンを使用してトップ1を選択した場合です..いつでも1つのca_idに対してのみ3つのタイプを取得し、残りのケースには2つのタイプがあります(ABCとXYZ)

すべてのca_idレコードに対して空の型を取得する方法を提案できる人はいますか。

ありがとう

select lo_id,ca_id,Type,Status,Category

from (

select lo_id,ca_id,Type,Status,Category

from (


select  distinct  ln.lo_id,cast.ca_id, Type,Status, 
 'Category'= case when Type='ABC' then 'ABC'
when Type='XYZ' then 'XYZ' else ' ' End

 FROM  ln                           
INNER JOIN cast ON cast.ca_id = ln.ca_id
INNER JOIN  Type ON Type.TypeId = cast .TypeId 

 ) as Q1
where  Category in ('ABC','XYZ')

union

select  top 1  lo_id,ca_id,Type,Status,(select Category where Category in (' ',null)) 
from (

select  distinct  ln.lo_id,cast.ca_id, Type,Status, 
 'Category'= case when Type='ABC' then 'ABC'
when Type='XYZ' then 'XYZ' else ' ' End

 FROM  ln   
INNER JOIN cast ON cast.ca_id = ln.ca_id
INNER JOIN  Type ON Type.TypeId = cast .TypeId
)  as Q2
) as Q3
4

1 に答える 1

2

row_number()関数を使用して、ユニオンなしでこれを行うことができます。以下は、XYZとABCのすべてのレコードを取得し、他のカテゴリの最初のレコードのみを取得します。

select lo_id, ca_id, type, status, category
from (select distinct  ln.lo_id, cast.ca_id, Type, Status, 
             (case when Type='ABC' then 'ABC'
                   when Type='XYZ' then 'XYZ'
                   else ''
              End) as category,
             ROW_NUMBER() over (partition by ca_id, type) as seqnum
      FROM  ln INNER JOIN
            cast
            ON cast.ca_id = ln.ca_id INNER JOIN
            Type
            ON Type.TypeId = cast.TypeId 
     ) t
 where TYPE in ('ABC', 'XYZ') or seqnum = 1

ちなみに、CASTとTYPEは、SQLで他の意味を持っているため、列とエイリアスの適切な名前ではありません。

于 2012-09-10T18:06:15.697 に答える