Sql server 联盟并获得每项记录的前1名。。?

Sql server 联盟并获得每项记录的前1名。。?,sql-server,sql-server-2008,sql-server-2008-r2,union,Sql Server,Sql Server 2008,Sql Server 2008 R2,Union,在下面的查询中,我试图筛选类型值为“ABC”和“XYZ”的记录 每个ca_id最多可以有3种类型。(ABC、XYZ和“”) 我还必须得到一个空类型,我使用union 问题是当我使用union和pick top 1时。我在任何时候都只能为一个ca_id获得3种类型。其余的情况有2种类型。(ABC和XYZ) 有人能为每个ca_id记录提供一个空类型的建议吗 谢谢 select lo_id,ca_id,Type,Status,Category from ( select lo_id,ca_id,T

在下面的查询中,我试图筛选类型值为“ABC”和“XYZ”的记录

每个ca_id最多可以有3种类型。(ABC、XYZ和“”)

我还必须得到一个空类型,我使用union

问题是当我使用union和pick 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

您可以使用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中有其他含义。

请提供示例数据和所需的输出。@user1046415我认为注释对于示例数据来说是一个非常糟糕的地方。试试看,我打赌你会得到更好的结果。编辑:我所指的注释似乎已被删除。lo_id ca_id类型状态类别320728 309562 ABC已启动ABC 320728 309562还款已启动320728 309562 XYZ已启动XYZ 494613 54549 ABC已启动ABC 494613 549 XYZ已启动XYZ@user1046415看起来你删除了这条评论的原始帖子,然后就转载了。我真的无法理解它,因为你不能在评论中格式化。要么编辑你的帖子,要么添加一条评论,并链接到SQLFiddle之类的东西(这会更有用)。另外,在不知道表结构的情况下,这个问题会更加困难,我不想根据查询中使用的所有内容来尝试解决它。如果你能告诉我们哪些桌子在比赛中,你想从他们那里得到什么,以及你有什么限制,这将非常有帮助。非常感谢…它起了作用…太棒了…我还将更改我的桌子名称…再次非常感谢…谢谢你的时间