简体   繁体   English

使用 CASE WHEN 表达式计算 SQL 中跨列的文本值

[英]Count text values across columns in SQL using CASE WHEN expressions

I have a table where I am determining whether a person's ID number exists across multiple databases.我有一个表,用于确定一个人的 ID 号是否存在于多个数据库中。 If the ID exists in only one database, then I would like to add another column that labels the person as "UNIQUE";如果 ID 仅存在于一个数据库中,那么我想添加另一列将该人标记为“唯一”; otherwise, it should be labeled as "NOT UNIQUE".否则,它应该被标记为“NOT UNIQUE”。

My query thus far is set up like this:到目前为止,我的查询设置如下:

/* CTE that creates a long column of all distinct PersonID's across three databases */

WITH cte as
(SELECT DISTINCT t1.*
FROM 
(SELECT PersonID FROM DB_1.dbo.Persons
 UNION
 SELECT PersonID FROM DB_2.dbo.Persons
 UNION
 SELECT PersonID FROM DB_3.dbo.Persons)
t1)

/* Use CASE WHEN statements to check if Person exists in three other tables in DB_1, DB_2, and DB_3 */ 

SELECT PersonID,
    CASE WHEN PersonID IN (SELECT PersonID FROM DB_1.dbo.Table_1
                            UNION
                            SELECT PersonID FROM DB_1.dbo.Table_2
                            UNION 
                            SELECT PersonID FROM DB_1.dbo.Table_3)
    THEN 'TRUE'
    ELSE 'FALSE'
    END AS IN_DB_1,

    CASE WHEN PersonID IN (SELECT PersonID FROM DB_2.dbo.Table_1
                            UNION
                            SELECT PersonID FROM DB_2.dbo.Table_2
                            UNION 
                            SELECT PersonID FROM DB_2.dbo.Table_3)
    THEN 'TRUE'
    ELSE 'FALSE'
    END AS IN_DB_2,

    CASE WHEN PersonID IN (SELECT PersonID FROM DB_3.dbo.Table_1
                            UNION
                            SELECT PersonID FROM DB_3.dbo.Table_2
                            UNION 
                            SELECT PersonID FROM DB_3.dbo.Table_3)
    THEN 'TRUE'
    ELSE 'FALSE'
    END AS IN_DB_3

FROM cte

The results look like this:结果如下所示:

PersonID   IN_DB_1    IN_DB_2    IN_DB_3
---------|----------|----------|----------|
001         TRUE       FALSE      FALSE
002         FALSE      TRUE       TRUE
003         TRUE       FALSE      FALSE
004         FALSE      TRUE       FALSE
005         TRUE       FALSE      TRUE

As can be seen, PersonID numbers 001, 003, and 004 appear only in one database.可以看出,PersonID 编号 001、003 和 004 仅出现在一个数据库中。 I would like to add a fifth column called "PID_UNIQUE" that counts the number of "TRUE" text values across the columns and specifies whether the person is unique.我想添加名为“PID_UNIQUE”的第五列,它计算各列中“TRUE”文本值的数量,并指定此人是否唯一。

It should look like this:它应该是这样的:

PersonID   IN_DB_1    IN_DB_2    IN_DB_3    PID_UNIQUE
---------|----------|----------|----------|-----------|
001         TRUE       FALSE      FALSE      UNIQUE
002         FALSE      TRUE       TRUE      NOT UNIQUE
003         TRUE       FALSE      FALSE      UNIQUE
004         FALSE      TRUE       FALSE      UNIQUE
005         TRUE       FALSE      TRUE      NOT UNIQUE

I assume this would be set up using another CASE WHEN expression.我假设这将使用另一个 CASE WHEN 表达式进行设置。 I am a little stuck as to how I could write that out to count across the three "IN_DB_no" columns.我有点不知道如何写出来以计算三个“IN_DB_no”列。

I tried this:我试过这个:

CASE WHEN COUNT('TRUE') = 1
THEN 'UNIQUE'
ELSE 'NOT UNIQUE'
END AS PID_UNIQUE

However, it returned a column where all records were unique, which is not what I need.但是,它返回了一个所有记录都是唯一的列,这不是我需要的。

I have a table where I am determining whether a person's ID number exists across multiple databases.我有一个表,用于确定一个人的 ID 号是否存在于多个数据库中。

Your sample query references many more tables than this suggests.您的示例查询引用的表比这建议的多得多。 Hence, it seems much more complicated than necessary.因此,它似乎比必要的要复杂得多。

Let me assume that there are really three tables, one in each database.让我假设实际上有三个表,每个数据库中一个。 I see just an aggregation after UNION ALL :我只看到UNION ALL之后的聚合:

SELECT PersonID, MAX(in_1), MAX(in_2), MAX(in_3),
       (CASE WHEN MAX(in_1) + MAX(in_2) + MAX(in_3) = 1 THEN 'UNIQUE'
             ELSE 'NOT UNIQUE'
        END) as pid_Unique
FROM ((SELECT DISTINCT PersonID, 1 as in_1, 0 as in_2, 0 as in_3
       FROM DB_1.dbo.Persons
      ) UNION ALL
      (SELECT DISTINCT PersonID, 0 as in_1, 1 as in_2, 0 as in_3
       FROM DB_2.dbo.Persons
      ) UNION ALL
      (SELECT DISTINCT PersonID, 0 as in_1, 0 as in_2, 1 as in_3
       FROM DB_3.dbo.Persons
      )
     ) p
GROUP BY PersonId;

I figured out a solution that works for me using the CROSS APPLY operator, along with a CASE / WHEN expression.我找到了一个使用CROSS APPLY运算符以及 CASE / WHEN 表达式的解决方案。

Basically, I added an additional column to the table I already made.基本上,我在我已经制作的表格中添加了一个额外的列。

The query looked like this:查询如下所示:

SELECT * FROM My_New_DB.dbo.My_New_Tbl

CROSS APPLY (
              SELECT CASE WHEN 1 = (SELECT COUNT(*)
              FROM (VALUES (IN_DB_1), (IN_DB_2), (IN_DB_3)) C (Val)
              WHERE Val = 'TRUE')
              THEN 'UNIQUE'
              ELSE 'NOT UNIQUE'
              END AS UNIQUE_ID
                               ) A

Simply put, when 1 = 1, it is unique.简单地说,当 1 = 1 时,它是唯一的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM