在下面的查询中,我试图过滤类型值为'ABC'和'XYZ'的记录。
每个ca_id最多可以有3种类型。(ABC,XYZ和'')
而且我必须得到一个空类型,我正在使用union。
问题是当我使用union并选择top 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
答案 0 :(得分: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中有其他含义。