基于1个表中的3列的case语句

时间:2019-07-02 17:12:37

标签: sql sql-server tsql

我正在尝试在我的sql代码中创建一个字段,如果第1行和第2行的MRN值相同并且对应的TF_GROUP相同,但两行的PathId字段不同,则新字段应具有'是”,否则应默认为“否”。我可以在excel中创建此字段,但正在努力在sql中创建类似的内容。我已经包含了我编写的excel语句,理想情况下,我希望在下面的sql语句中复制该语句。

=IF(AND(B2=B3,D2=D3,A2<>A3),"Yes","No")

我基本上想要一种类似于上面excel函数的sql语法,我可以在sql server中使用它来创建我想要的列。

下面是我用3个字段(PathID,MRN,TF_GROUP)编写的sql代码。

 select DISTINCT 
[Pathway ID] PathID,
MRN,
DENSE_RANK() OVER(PARTITION BY mrn ORDER BY [Pathway ID]) RK,
[Treatment Function Group] TF_GROUP,
'' [Flag]

from [HRS_RTT].[dbo].[tbl_PMM_IncompletePTL_CG_Snapshot] 
where convert(date,censusdate) between '03-jun-19' and '09-jun-19'
AND MRN IS NOT NULL
AND [Treatment Function Group] IS NOT NULL

order by
MRN,
[Pathway ID]

这是运行嵌入式sql代码后输出的一部分(请参见下面的链接)。我正在努力在上面的sql代码中复制名为“ Flag”的列。此刻,我必须将输出复制到excel中,然后使用以前在上一篇文章中包含的功能填充“标记”列。

enter image description here

4 个答案:

答案 0 :(得分:4)

SELECT
    CASE
        WHEN B2 = B3 AND D2 = D3 AND A2 <> A3 THEN 'Y'
        ELSE 'N'
    END AS SomeColumnName
FROM SomeTable

来源: https://docs.microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql?view=sql-server-2017

答案 1 :(得分:1)

案例表达将与Han给出的答案相同。如果您只有简单的IF / ELSE条件,也可以使用IIF。

SELECT IIF(B2 = B3 AND D2 = D3 AND A2 <> A3, 'Y', 'N') as SomeColumnName
From SomeTable

如果要测试的条件多种多样(IF THEN / IF THEN / IF THEN / ELSE),那么CASE比使用嵌套IIF更实用

答案 2 :(得分:1)

  

我正在尝试创建一个字段

您可以将计算列添加为

ALTER TABLE YourTableName
ADD NewColumnName AS CASE WHEN B2=B3 AND D2=D3 AND A2<>A3 THEN 'Y' ELSE 'N' END;

答案 3 :(得分:0)

其他答案都没有解决:这个问题是关于跨行比较。问题是如何在SQL中复制此Excel公式:

=IF(AND(B2=B3,D2=D3,A2<>A3),"Yes","No")

例如,请注意,B2指的是第2行的B列,而B3指的是第 3 行的B列。

这里是您所描述问题的解决方案。它使用T-SQL LEAD函数在各行之间进行比较。请注意,由于您不清楚要执行的操作尚不清楚,因此我没有在原始查询中包含DISTINCT条条件。

但是,我认为这不一定是您要执行的操作。在SQL中通常不做跨行比较。您可能需要进一步考虑自己的要求,看看是否可以提出一种更好的方法来满足要求。

select
    PathID,
    MRN,
    TF_Group,
    case
        when MRN = Next_MRN and TF_Group = Next_TF_Group and PathID <> Next_PathID then 'Yes'
        else 'No'
    end as Flag
from (
    select
        [Pathway Id] as PathID,
        MRN,
        [Treatment Function Group] as TF_Group,

        lead([Pathway Id]) over (order by MRN, [Pathway ID]) as Next_PathID,
        lead(MRN) over (order by MRN, [Pathway ID]) as Next_MRN,
        lead([Treatment Function Group])  over (order by MRN, [Pathway ID]) as Next_TF_Group
    from tbl_PMM_IncompletePTL_CG_Snapshot
) x
order by MRN, PathID

请注意,此答案本质上是我在问题上发布的被标记为重复的答案的重复。我将其移到这里是为了防止丢失,这样任何发现此问题的人都会得到此答案。