簡體   English   中英

使用 CASE WHEN 表達式計算 SQL 中跨列的文本值

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

我有一個表,用於確定一個人的 ID 號是否存在於多個數據庫中。 如果 ID 僅存在於一個數據庫中,那么我想添加另一列將該人標記為“唯一”; 否則,它應該被標記為“NOT UNIQUE”。

到目前為止,我的查詢設置如下:

/* 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

結果如下所示:

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

可以看出,PersonID 編號 001、003 和 004 僅出現在一個數據庫中。 我想添加名為“PID_UNIQUE”的第五列,它計算各列中“TRUE”文本值的數量,並指定此人是否唯一。

它應該是這樣的:

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

我假設這將使用另一個 CASE WHEN 表達式進行設置。 我有點不知道如何寫出來以計算三個“IN_DB_no”列。

我試過這個:

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

但是,它返回了一個所有記錄都是唯一的列,這不是我需要的。

我有一個表,用於確定一個人的 ID 號是否存在於多個數據庫中。

您的示例查詢引用的表比這建議的多得多。 因此,它似乎比必要的要復雜得多。

讓我假設實際上有三個表,每個數據庫中一個。 我只看到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;

我找到了一個使用CROSS APPLY運算符以及 CASE / WHEN 表達式的解決方案。

基本上,我在我已經制作的表格中添加了一個額外的列。

查詢如下所示:

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

簡單地說,當 1 = 1 時,它是唯一的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM