Sql server 用于将帐户分类为x和其他帐户的SQL查询

Sql server 用于将帐户分类为x和其他帐户的SQL查询,sql-server,Sql Server,我有一个SQL Server 2012数据库,我有以下表格: CNSMR_账户(消费者账户) CMSR\u账户标签(分配给消费者账户的标签) TAT(标签表) 一个帐户可能有多个标记指定给它,以指示各种特征。我正在尝试将我的帐户分为第三方帐户和其他帐户。因此,如果一个帐户有标签“3PTSALE”,不管它可能有什么其他标签,它都被视为第三方。没有标签“3PTSALE”的帐户被归类为“其他” 例如,假设有一个帐户1233,其标签为“ABC”、“DEF”、“KLY”和“3PTSALE”,则该帐户必

我有一个SQL Server 2012数据库,我有以下表格:

  • CNSMR_账户(消费者账户)
  • CMSR\u账户标签(分配给消费者账户的标签)
  • TAT(标签表)
一个帐户可能有多个标记指定给它,以指示各种特征。我正在尝试将我的帐户分为第三方帐户和其他帐户。因此,如果一个帐户有标签“3PTSALE”,不管它可能有什么其他标签,它都被视为第三方。没有标签“3PTSALE”的帐户被归类为“其他”

例如,假设有一个帐户1233,其标签为“ABC”、“DEF”、“KLY”和“3PTSALE”,则该帐户必须归类为3PTSALE。相比之下,账户1234有标签“ABC”、“DEF”、“NOP”、“JKL”,而该账户被归类为“其他”,因为它没有标签“3PTSALE”

这里是我到目前为止编写的一些代码,但我还不能确定如何对数据进行分类。不起作用,但希望能告诉你我正在努力实现的目标

Select ca.cnsmr_accnt_id, tag_shrt_nm, 
case 
ca.cnsmr_accnt_id in 
(select cat.cnsmr_accnt_id from cnsmr_accnt_tag cat inner join tag t on 
cat.tag_id = t.tag_id 
where tag_shrt_nm = '3PTSALE' and cat.cnsmr_accnt_sft_delete_flg = 'N') 
when  then '3PTSALE'
Else 
'Other'
End  as 'SIE_CATEGORY'

from cnsmr_accnt ca inner join
cnsmr_accnt_tag cat on ca.cnsmr_accnt_id = cat.cnsmr_accnt_id 
inner join tag t on cat.tag_id = t.tag_id 
where cat.cnsmr_accnt_sft_delete_flg = 'N'

如果您已经加入到相关的表中,您是否可以像这样简化您的案例陈述:

case  when tag_shrt_nm = '3PTSALE' then '3PTSALE' else 'Other' end as [SIE_CATEGORY]
WITH THIRDPTAG AS
(
   SELECT cnsmr_accnt_id, tag_shrt_nm 
   FROM cnsmr_accnt_tag 
   WHERE tag_shrt_nm = '3PTSALE' and cat.cnsmr_accnt_sft_delete_flg = 'N'
)
Select ca.cnsmr_accnt_id, tag_shrt_nm, 
       coalesce(3PTITEMS.tag_shrt_nm,'Other') as SIE_CATEGORY
from cnsmr_accnt ca 
left join THIRDPTAG on ca.cnsmr_accnt_id = THIRDPTAG.cnsmr_accnt_id 
inner join cnsmr_accnt_tag cat on ca.cnsmr_accnt_id = cat.cnsmr_accnt_id 
inner join tag t on cat.tag_id = t.tag_id 
where cat.cnsmr_accnt_sft_delete_flg = 'N'
这样,您就不需要在case语句中使用子查询了

在case语句中使用EXISTS()函数:

...
CASE
  WHEN EXISTS( 
    SELECT * FROM TAG t2 WHERE t2.Tag_id=t.Tag_id AND t2.tag_shrt_nm = '3PTSALE' 
  ) THEN '3PTSALE'
  ELSE 'Other'
END AS 'SIE_CATEGORY'
...

这基本上是说,“如果存在一个名为'3PTSale'的标记,它连接到我当前正在查看的行,那么返回'3PTSale'。如果不存在这样的行,则返回'Other'。

如果我理解您的要求,我会这样做:

case  when tag_shrt_nm = '3PTSALE' then '3PTSALE' else 'Other' end as [SIE_CATEGORY]
WITH THIRDPTAG AS
(
   SELECT cnsmr_accnt_id, tag_shrt_nm 
   FROM cnsmr_accnt_tag 
   WHERE tag_shrt_nm = '3PTSALE' and cat.cnsmr_accnt_sft_delete_flg = 'N'
)
Select ca.cnsmr_accnt_id, tag_shrt_nm, 
       coalesce(3PTITEMS.tag_shrt_nm,'Other') as SIE_CATEGORY
from cnsmr_accnt ca 
left join THIRDPTAG on ca.cnsmr_accnt_id = THIRDPTAG.cnsmr_accnt_id 
inner join cnsmr_accnt_tag cat on ca.cnsmr_accnt_id = cat.cnsmr_accnt_id 
inner join tag t on cat.tag_id = t.tag_id 
where cat.cnsmr_accnt_sft_delete_flg = 'N'

不,它没有告诉我们你想要实现什么。你想达到什么目的???他们保证至少有一个标签吗?如果没有,您将需要一个
左侧外部
连接,而不是
内部
连接到
标记
表。问题是一个帐户可以有许多标记,因此如果我这样做,我会得到一个帐户,例如123355,既有3PTSALE,也有OTHER。您不会这样做,因为一个标记只能有一个值。与单个值进行比较的想法对这种结构没有意义。也许最好先将标记放入CTE中,以避免重新查询每个帐户行?