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